Arduino programozás segítség

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino programozás segítség

Hozzászólás Szerző: kapu48 »

Gondol át újra az egészet!
Mert most minden olyan else ág mindig végrehajtódik, ahol nincsen megnyomva a gomb.
GITTER55
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2024. február 7. szerda, 11:31

Re: Arduino programozás segítség

Hozzászólás Szerző: GITTER55 »

Üdv! Segítséget szeretnék kérni! Arduino megea 2560, két nyomómbbal szervó vezérlés. (Vasútmodell váltó vezérlés) Egy nyomógom-párral tökéletesen működik. Megpróbáltam kiterjeszteni két nyomógomb-párra, de a fordításnál állandóan hibaüzenetet kapok. Már minden tőlem telhetőt kipróbáltam, de nem tudom megszüntetni a problémát. Az eredeti (működi kód):
#include <Servo.h> // add servo library
#define sw1_pin 5
#define sw2_pin 6
Servo myservo; // create servo object to control a servo

volatile boolean sw1 = false;
volatile boolean sw2 = false;

uint8_t sw1ButtonState = 0;
uint8_t sw2ButtonState = 0;

uint8_t lastsw1ButtonState = 0;
uint8_t lastsw2ButtonState = 0;

void setup() {
pinMode(sw1_pin, INPUT_PULLUP);
pinMode(sw2_pin, INPUT_PULLUP);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {

checkIfSw1ButtonIsPressed();
checkIfSw2ButtonIsPressed();

if( sw1){
sw1 = false;
myservo.write(75);
delay(15);
}
else if( sw2){
sw2 = false;
myservo.write(105);
delay(15);
}

// waits for the servo to get there
}

void checkIfSw1ButtonIsPressed()
{
sw1ButtonState = digitalRead(sw1_pin);

if (sw1ButtonState != lastsw1ButtonState)
{
if ( sw1ButtonState == 0)
{
sw1=true;
}
delay(50);
}
lastsw1ButtonState = sw1ButtonState;
}

void checkIfSw2ButtonIsPressed()
{
sw2ButtonState = digitalRead(sw2_pin);

if (sw2ButtonState != lastsw2ButtonState)
{
if ( sw2ButtonState == 0)
{
sw2=true;
}
delay(50);
}
lastsw2ButtonState = sw2ButtonState;
}
GITTER55
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2024. február 7. szerda, 11:31

Re: Arduino programozás segítség

Hozzászólás Szerző: GITTER55 »

A kiterjesztett verzió:
#include <Servo.h>;

Servo myservo1, myservo2, myservo3;

const int sw1_pin = 22;
const int sw2_pin = 23;
const int sw3_pin = 24;
const int sw4_pin = 25;


volatile boolean sw1 = false;
volatile boolean sw2 = false;
volatile boolean sw3 = false;
volatile boolean sw4 = false;


uint8_t sw1ButtonState = 0;
uint8_t sw2ButtonState = 0;
uint8_t sw3ButtonState = 0;
uint8_t sw4ButtonState = 0;


uint8_t lastsw1ButtonState = 0;
uint8_t lastsw2ButtonState = 0;
uint8_t lastsw3ButtonState = 0;
uint8_t lastsw4ButtonState = 0;


void setup() {
pinMode(sw1_pin, INPUT_PULLUP);
pinMode(sw2_pin, INPUT_PULLUP);
pinMode(sw3_pin, INPUT_PULLUP);
pinMode(sw4_pin, INPUT_PULLUP);

myservo1.attach(2); // attaches the servo on pin 9 to the servo object
myservo1.attach(3);
myservo1.attach(4);

}

void loop() {


checkIfSw1ButtonIsPressed();
checkIfSw2ButtonIsPressed();


if( sw1){
sw1 = false;
myservo1.write(60);

delay(15);
}
else if( sw2){
sw2 = false;
myservo1.write(105);

delay(15);
}

// waits for the servo to get there
}

void checkIfSw1ButtonIsPressed()
{
sw1ButtonState = digitalRead(sw1_pin);

if (sw1ButtonState != lastsw1ButtonState)
{
if ( sw1ButtonState == 0)
{
sw1=true;
}
delay(50);
}
lastsw1ButtonState = sw1ButtonState;
}

void checkIfSw2ButtonIsPressed()
{
sw2ButtonState = digitalRead(sw2_pin);

if (sw2ButtonState != lastsw2ButtonState)
{
if ( sw2ButtonState == 0)
{
sw2=true;
}
delay(50);
}
lastsw2ButtonState = sw2ButtonState;
}

checkIfSw3ButtonIsPressed(); // Itt jelzi a problémát!!!
checkIfSw4ButtonIsPressed();


if( sw3){
sw3 = false;
myservo2.write(60);
myservo3.write(60);
delay(15);
}
else if( sw4){
sw4 = false;
myservo2.write(105);
myservo3.write(105);
delay(15);
}

// waits for the servo to get there


void checkIfSw3ButtonIsPressed()
{
sw3ButtonState = digitalRead(sw3_pin);

if (sw3ButtonState != lastsw3ButtonState)
{
if ( sw3ButtonState == 0)
{
sw3=true;
}
delay(50);
}
lastsw3ButtonState = sw3ButtonState;
}

void checkIfSw4ButtonIsPressed()
{
sw4ButtonState = digitalRead(sw4_pin);

if (sw4ButtonState != lastsw4ButtonState)
{
if ( sw4ButtonState == 0)
{
sw4=true;
}
delay(50);
}
lastsw4ButtonState = sw4ButtonState;
}

Ha valaki tud, kérem segítsen!!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Arduino programozás segítség

Hozzászólás Szerző: kapu48 »

Igy lefordul! Ha csak ennyi volt a baj?

Kód: Egész kijelölése

//A kiterjesztett verzió:
#include <Servo.h>

Servo myservo1, myservo2, myservo3;

const int sw1_pin = 22;
const int sw2_pin = 23;
const int sw3_pin = 24;
const int sw4_pin = 25;


volatile boolean sw1 = false;
volatile boolean sw2 = false;
volatile boolean sw3 = false;
volatile boolean sw4 = false;


uint8_t sw1ButtonState = 0;
uint8_t sw2ButtonState = 0;
uint8_t sw3ButtonState = 0;
uint8_t sw4ButtonState = 0;


uint8_t lastsw1ButtonState = 0;
uint8_t lastsw2ButtonState = 0;
uint8_t lastsw3ButtonState = 0;
uint8_t lastsw4ButtonState = 0;


void setup() {
  pinMode(sw1_pin, INPUT_PULLUP);
    pinMode(sw2_pin, INPUT_PULLUP);
pinMode(sw3_pin, INPUT_PULLUP);
  pinMode(sw4_pin, INPUT_PULLUP);

  myservo1.attach(2); // attaches the servo on pin 9 to the servo object
  myservo1.attach(3);
  myservo1.attach(4);

}

void loop() {


  checkIfSw1ButtonIsPressed();
  checkIfSw2ButtonIsPressed();


  if( sw1){
    sw1 = false;
    myservo1.write(60);

    delay(15);
  }
  else if( sw2){
    sw2 = false;
    myservo1.write(105);

    delay(15);
  }

// waits for the servo to get there
}

void checkIfSw1ButtonIsPressed()
{
  sw1ButtonState = digitalRead(sw1_pin);

  if (sw1ButtonState != lastsw1ButtonState)
  {
    if ( sw1ButtonState == 0)
    {
      sw1=true;
    }
    delay(50);
  }
  lastsw1ButtonState = sw1ButtonState;
}

void checkIfSw2ButtonIsPressed()
{
  sw2ButtonState = digitalRead(sw2_pin);

  if (sw2ButtonState != lastsw2ButtonState)
  {
    if ( sw2ButtonState == 0)
    {
      sw2=true;
    }
    delay(50);
  }
  lastsw2ButtonState = sw2ButtonState;
//}

  checkIfSw3ButtonIsPressed(); // Itt jelzi a problémát!!!
  checkIfSw4ButtonIsPressed();


  if( sw3){
    sw3 = false;
    myservo2.write(60);
    myservo3.write(60);
    delay(15);
  }
  else if( sw4){
    sw4 = false;
    myservo2.write(105);
    myservo3.write(105);
    delay(15);
  }
}
// waits for the servo to get there


void checkIfSw3ButtonIsPressed()
{
  sw3ButtonState = digitalRead(sw3_pin);

  if (sw3ButtonState != lastsw3ButtonState)
  {
    if ( sw3ButtonState == 0)
    {
      sw3=true;
    }
    delay(50);
  }
  lastsw3ButtonState = sw3ButtonState;
}

void checkIfSw4ButtonIsPressed()
{
  sw4ButtonState = digitalRead(sw4_pin);

  if (sw4ButtonState != lastsw4ButtonState)
  {
    if ( sw4ButtonState == 0)
    {
      sw4=true;
    }
    delay(50);
  }
  lastsw4ButtonState = sw4ButtonState;
}

Avatar
tursaba
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. április 3. szombat, 6:00

Arduino progmem

Hozzászólás Szerző: tursaba »

Atmega 2560, Arduino IDE 2.3.8
2 dimenziós tömböt nem tudok deklarálni.
Fordítási hibát nem ad.
A tömbök méretét változtatva nem változik a foglalt byte-ok száma.
// Arduino IDE 2.3.8 ; ATMEGA 2560
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#include <Arduino.h>
#include <progmem_far.h>

//#####################################################################

#define pulseHigh(pin) {digitalWrite(pin, HIGH);digitalWrite(pin, LOW);}
#define pb_rst 46 // Joystick pins
#define pb_set 44
#define pb_mid 42
#define pb_right 40
#define pb_left 38
#define pb_down 36
#define pb_up 34
//##############################################################################################
//##############################################################################################

//LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
LiquidCrystal lcd(12, 13, 10, 11, 8, 9);

//############################################################################################
//##################### TÖMBÖK ###############################################

const uint16_t tabla1[40][22] PROGMEM=
{
{0,12300,7908, 0},

{1,14030,7280, 0},

};
//###########################################################################################
const uint16_t tabla2[390][25] PROGMEM=
{



};
//##############################################################################################################

void setup() {


pinMode (13, OUTPUT);

//----------------------------------
pinMode(pb_rst, INPUT);
pinMode(pb_set, INPUT);
pinMode(pb_mid, INPUT);
pinMode(pb_right, INPUT);
pinMode(pb_left, INPUT);
pinMode(pb_left, INPUT);
pinMode(pb_down, INPUT);


digitalWrite(46, HIGH); // RST fELHÚZÓ ELLENÁLLÁS BEKAPCS.
digitalWrite(44, HIGH); // SET
digitalWrite(42, HIGH); // MID
digitalWrite(40, HIGH); // RIGHT
digitalWrite(38, HIGH); // LEFT fELHÚZÓ ELLENÁLLÁS BEKAPCS.
digitalWrite(36, HIGH); // DOWN
digitalWrite(34, HIGH); // UP

//--------------------------------
lcd.display();
// lcd.init();
delay(500);
lcd.begin(20, 4); //Az LCD 4 sor, 20 oszlopos

}

//================================================================================================

bool start;
int elem = 0 ; // +- 32767
byte count ; //0 - 255
long int t ;
long int newt ;
long int oldt ;

void loop()

{

do
{

lcd.setCursor(9,2); // oszlop 6, sor 2
lcd.print ("teszt");


//----------------------------------------
if (digitalRead(42) == LOW) // Start pb_mid
{
start = HIGH;
}

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

if (digitalRead(36) == LOW) // lefelé léptetés pb_down
{
start = LOW;
elem = 0;
lcd.setCursor(5,1); // oszlop 2, sor 2
lcd.print(" ");

delay(500);
}
//---------------------------------START--------------------------------------

if (digitalRead(42) == LOW) // 42 pb_mid
{
start = HIGH;
lcd.setCursor(14,1); // oszlop 2, sor 2
lcd.print("START");

lcd.setCursor(6,2); // oszlop 10, sor 2
lcd.print("db");

}

}

// while (n != 0);
while (1) ;

}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10215
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino programozás segítség

Hozzászólás Szerző: Robert »

A deklaráció jó. A gond valószínűleg az, hogy a tömböt nem használod, ezért a fordító optimalizáláskor elhagyhatja.

Ez:

const uint16_t tabla2[390][25] PROGMEM = {};

méretben:

390 × 25 × 2 = 19 500 byte

De ez **Flash memóriába** kerül, nem RAM-ba, ezért a „dynamic memory” értéke nem változik.

Ha ténylegesen kiolvasol belőle például:

uint16_t x = pgm_read_word(&tabla2[0][0]);

akkor a programmemória-foglalásnak már változnia kell.

A `tabla1[40][22]` deklaráció is teljesen szabályos.
http://www.tavir.hu - a gazda :)
Válasz küldése