Arduino programozás segítség
Re: Arduino programozás segítség
Gondol át újra az egészet!
Mert most minden olyan else ág mindig végrehajtódik, ahol nincsen megnyomva a gomb.
Mert most minden olyan else ág mindig végrehajtódik, ahol nincsen megnyomva a gomb.
Re: Arduino programozás segítség
Ü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;
}
#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;
}
Re: Arduino programozás segítség
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!!
#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!!
Re: Arduino programozás segítség
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;
}
Arduino progmem
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) ;
}
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) ;
}
Re: Arduino programozás segítség
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.
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 
