eso32 laatste positie behouden na reset
5 berichten
• Pagina 1 van 1
- Marca 1342
- Berichten: 3
- Geregistreerd: 16 Jun 2022, 18:35
eso32 laatste positie behouden na reset
Dag , . Ik heb een code met twee knoppen hoog en laag met servo met led aanduiding welke pos je staat . De laatste positie ik instel . vb: pos 7 graden onthoud hij niet na reset of de spanning in of en terug aan . De code begint opnieuw , niet de laatste instelling . Is het mogelijk om de laatste positie terug te hebben na reset ?
De bedoeling is voor een servomotor op de versnellingen van een fiets te plaatsen . Ik ben nog niet lang bezig programmeren maar een hint zou welkom zijn .Dank
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos =0; // initial angle for servo
int posStep =7;
#define LEFT 12 // pin 12 is connected to left button
#define RIGHT 2 // pin 2 is connected to right button
#define LED_PIN1 17
#define LED_PIN2 27
#define LED_PIN3 26
#define LED_PIN4 25
#define LED_PIN5 33
#define LED_PIN6 32
#define LED_PIN7 19
#define LED_PIN8 18
#define LED_PIN9 21
void setup() {
Serial.begin(115200); // setup serial
myservo.attach(13);// attaches the servo on pin 9 to the servo object
pinMode(LEFT,INPUT_PULLUP);// assign pin 12 ass input for Left button
pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
myservo.write(pos);// send servo to the middle at 90 degrees
Serial.println("Servo Button ");
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
pinMode(LED_PIN6, OUTPUT);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
pinMode(LED_PIN9, OUTPUT);
}
void loop() {
// Servo button
while(digitalRead(RIGHT) == LOW){
if (pos > 0 && pos <= 42) {
pos = pos - posStep;
if(pos < 0){
pos = 0;
}else {digitalWrite(LED_PIN1, HIGH);
myservo.write(pos); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(pos);// print the angle
Serial.println(" degree");
if (pos !=0)digitalWrite(LED_PIN3, LOW);
if (pos !=7)digitalWrite(LED_PIN4, LOW);
if (pos !=14)digitalWrite(LED_PIN5, LOW);
if (pos !=21)digitalWrite(LED_PIN6, LOW);
if (pos !=28)digitalWrite(LED_PIN7, LOW);
if (pos !=35)digitalWrite(LED_PIN8, LOW);
if (pos !=42)digitalWrite(LED_PIN9, LOW);
if (pos ==0)digitalWrite(LED_PIN3, HIGH);
if (pos ==7)digitalWrite(LED_PIN4, HIGH);
if (pos ==14)digitalWrite(LED_PIN5, HIGH);
if (pos ==21)digitalWrite(LED_PIN6, HIGH);
if (pos ==28)digitalWrite(LED_PIN7, HIGH);
if (pos ==35)digitalWrite(LED_PIN8, HIGH);
if (pos ==42)digitalWrite(LED_PIN9, HIGH);
}
}
delay(800);digitalWrite(LED_PIN1,LOW);// waits for the servo to get there
}
while(digitalRead(LEFT) == LOW){
if (pos >= 0 && pos <= 42) {
pos = pos + posStep;
if(pos >42){
pos=42;
}else{digitalWrite(LED_PIN2, HIGH);
myservo.write(pos);// move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(pos); // print the angle
Serial.println(" degree");
if (pos !=0)digitalWrite(LED_PIN3, LOW);
if (pos !=7)digitalWrite(LED_PIN4, LOW);
if (pos !=14)digitalWrite(LED_PIN5, LOW);
if (pos !=21)digitalWrite(LED_PIN6, LOW);
if (pos !=28)digitalWrite(LED_PIN7, LOW);
if (pos !=35)digitalWrite(LED_PIN8, LOW);
if (pos !=42)digitalWrite(LED_PIN9, LOW);
if (pos == 0)digitalWrite(LED_PIN3, HIGH);
if (pos == 7)digitalWrite(LED_PIN4, HIGH);
if (pos == 14)digitalWrite(LED_PIN5, HIGH);
if (pos == 21)digitalWrite(LED_PIN6, HIGH);
if (pos == 28)digitalWrite(LED_PIN7, HIGH);
if (pos == 35)digitalWrite(LED_PIN8, HIGH);
if (pos == 42)digitalWrite(LED_PIN9, HIGH);
}
}
delay(800);digitalWrite(LED_PIN2,LOW); // waits for the servo to get there
}//
}
De bedoeling is voor een servomotor op de versnellingen van een fiets te plaatsen . Ik ben nog niet lang bezig programmeren maar een hint zou welkom zijn .Dank
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos =0; // initial angle for servo
int posStep =7;
#define LEFT 12 // pin 12 is connected to left button
#define RIGHT 2 // pin 2 is connected to right button
#define LED_PIN1 17
#define LED_PIN2 27
#define LED_PIN3 26
#define LED_PIN4 25
#define LED_PIN5 33
#define LED_PIN6 32
#define LED_PIN7 19
#define LED_PIN8 18
#define LED_PIN9 21
void setup() {
Serial.begin(115200); // setup serial
myservo.attach(13);// attaches the servo on pin 9 to the servo object
pinMode(LEFT,INPUT_PULLUP);// assign pin 12 ass input for Left button
pinMode(RIGHT,INPUT_PULLUP);// assing pin 2 as input for right button
myservo.write(pos);// send servo to the middle at 90 degrees
Serial.println("Servo Button ");
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(LED_PIN5, OUTPUT);
pinMode(LED_PIN6, OUTPUT);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
pinMode(LED_PIN9, OUTPUT);
}
void loop() {
// Servo button
while(digitalRead(RIGHT) == LOW){
if (pos > 0 && pos <= 42) {
pos = pos - posStep;
if(pos < 0){
pos = 0;
}else {digitalWrite(LED_PIN1, HIGH);
myservo.write(pos); // move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(pos);// print the angle
Serial.println(" degree");
if (pos !=0)digitalWrite(LED_PIN3, LOW);
if (pos !=7)digitalWrite(LED_PIN4, LOW);
if (pos !=14)digitalWrite(LED_PIN5, LOW);
if (pos !=21)digitalWrite(LED_PIN6, LOW);
if (pos !=28)digitalWrite(LED_PIN7, LOW);
if (pos !=35)digitalWrite(LED_PIN8, LOW);
if (pos !=42)digitalWrite(LED_PIN9, LOW);
if (pos ==0)digitalWrite(LED_PIN3, HIGH);
if (pos ==7)digitalWrite(LED_PIN4, HIGH);
if (pos ==14)digitalWrite(LED_PIN5, HIGH);
if (pos ==21)digitalWrite(LED_PIN6, HIGH);
if (pos ==28)digitalWrite(LED_PIN7, HIGH);
if (pos ==35)digitalWrite(LED_PIN8, HIGH);
if (pos ==42)digitalWrite(LED_PIN9, HIGH);
}
}
delay(800);digitalWrite(LED_PIN1,LOW);// waits for the servo to get there
}
while(digitalRead(LEFT) == LOW){
if (pos >= 0 && pos <= 42) {
pos = pos + posStep;
if(pos >42){
pos=42;
}else{digitalWrite(LED_PIN2, HIGH);
myservo.write(pos);// move the servo to desired angle
Serial.print("Moved to: ");
Serial.print(pos); // print the angle
Serial.println(" degree");
if (pos !=0)digitalWrite(LED_PIN3, LOW);
if (pos !=7)digitalWrite(LED_PIN4, LOW);
if (pos !=14)digitalWrite(LED_PIN5, LOW);
if (pos !=21)digitalWrite(LED_PIN6, LOW);
if (pos !=28)digitalWrite(LED_PIN7, LOW);
if (pos !=35)digitalWrite(LED_PIN8, LOW);
if (pos !=42)digitalWrite(LED_PIN9, LOW);
if (pos == 0)digitalWrite(LED_PIN3, HIGH);
if (pos == 7)digitalWrite(LED_PIN4, HIGH);
if (pos == 14)digitalWrite(LED_PIN5, HIGH);
if (pos == 21)digitalWrite(LED_PIN6, HIGH);
if (pos == 28)digitalWrite(LED_PIN7, HIGH);
if (pos == 35)digitalWrite(LED_PIN8, HIGH);
if (pos == 42)digitalWrite(LED_PIN9, HIGH);
}
}
delay(800);digitalWrite(LED_PIN2,LOW); // waits for the servo to get there
}//
}
Advertisement
Re: eso32 laatste positie behouden na reset
Marca, nee dus. Bij opstarten weet de arduino niet waar de servo heen moet. Heb je een potmeter als input dan zal de servo direct de stand van de potmeter overnemen. Zoniet dan is er wel een truc. (of meerdere...?) Ik heb dit in een project opgelost door telkens de stand van de servo op te slaan in het eeprom geheugen. Belangrijk dan dat je het aantal schrijfacties naar de eeprom beperkt, heb ik gedaan door na iedere beweging een timer te starten die na afloop de stand opslaat. Dus tijdens continue bewegingen niet. Timer wordt dan telkens weer gereset. Verder het eeprom adres telkens aanpassen bv na iedere keer opstarten, zodat je de levensduur van de eeprom verlengd. Werkt feilloos bij mij voor een project met 8 servoos.
Succes Rob
Succes Rob
- Marca 1342
- Berichten: 3
- Geregistreerd: 16 Jun 2022, 18:35
Re: eso32 laatste positie behouden na reset
RobGood schreef:Marca, nee dus. Bij opstarten weet de arduino niet waar de servo heen moet. Heb je een potmeter als input dan zal de servo direct de stand van de potmeter overnemen. Zoniet dan is er wel een truc. (of meerdere...?) Ik heb dit in een project opgelost door telkens de stand van de servo op te slaan in het eeprom geheugen. Belangrijk dan dat je het aantal schrijfacties naar de eeprom beperkt, heb ik gedaan door na iedere beweging een timer te starten die na afloop de stand opslaat. Dus tijdens continue bewegingen niet. Timer wordt dan telkens weer gereset. Verder het eeprom adres telkens aanpassen bv na iedere keer opstarten, zodat je de levensduur van de eeprom verlengd. Werkt feilloos bij mij voor een project met 8 servoos.
Succes Rob
Dank je voor het antwoorden .Sorry ik ben een beetje laat he' . Ik overweeg om een potmeter bij te plaatsen indien de plaats het toelaat . Uw idee is ok met de eeprom ,maar zoals gezegd in het eerste gesprek ik ben niet zolang bezig met programmeren. Voor mij is dit iets teveel , om het toe te passen zoals jij het opgelost hebt. Of als je een voorbeeld kan tonen zou ik iets verder staan om de eeprom te programmeren. Dank. Gr uit Koksijde . be
Re: eso32 laatste positie behouden na reset
de oplossing ligt inderdaad bij eeprom geheugen een standaard arduino uno
een testje /*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/
#include <EEPROM.h>
/** the current address in the EEPROM (i.e. which byte we're going to write to next) **/
int addr = 0;
void setup() {
/** Empty setup. **/
}
void loop() {
/***
Need to divide by 4 because analog inputs range from
0 to 1023 and each byte of the EEPROM can only hold a
value from 0 to 255.
***/
int val = analogRead(0) / 4;
/***
Write the value to the appropriate byte of the EEPROM.
these values will remain there when the board is
turned off.
***/
EEPROM.write(addr, val);
/***
Advance to the next address, when at the end restart at the beginning.
Larger AVR processors have larger EEPROM sizes, E.g:
- Arduno Duemilanove: 512b EEPROM storage.
- Arduino Uno: 1kb EEPROM storage.
- Arduino Mega: 4kb EEPROM storage.
Rather than hard-coding the length, you should use the pre-provided length function.
This will make your code portable to all AVR processors.
***/
addr = addr + 1;
if (addr == EEPROM.length()) {
addr = 0;
}
/***
As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an
EEPROM address is also doable by a bitwise and of the length - 1.
++addr &= EEPROM.length() - 1;
***/
delay(100);
}
komt direct uit arduino.cc maar de analogin hoef je natuurlijk niet te gebruiken en opslaan hoef je alleen maar te doen als er een stand verandert in totaal heb je 512 bytes aan eeprom
een testje /*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/
#include <EEPROM.h>
/** the current address in the EEPROM (i.e. which byte we're going to write to next) **/
int addr = 0;
void setup() {
/** Empty setup. **/
}
void loop() {
/***
Need to divide by 4 because analog inputs range from
0 to 1023 and each byte of the EEPROM can only hold a
value from 0 to 255.
***/
int val = analogRead(0) / 4;
/***
Write the value to the appropriate byte of the EEPROM.
these values will remain there when the board is
turned off.
***/
EEPROM.write(addr, val);
/***
Advance to the next address, when at the end restart at the beginning.
Larger AVR processors have larger EEPROM sizes, E.g:
- Arduno Duemilanove: 512b EEPROM storage.
- Arduino Uno: 1kb EEPROM storage.
- Arduino Mega: 4kb EEPROM storage.
Rather than hard-coding the length, you should use the pre-provided length function.
This will make your code portable to all AVR processors.
***/
addr = addr + 1;
if (addr == EEPROM.length()) {
addr = 0;
}
/***
As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an
EEPROM address is also doable by a bitwise and of the length - 1.
++addr &= EEPROM.length() - 1;
***/
delay(100);
}
komt direct uit arduino.cc maar de analogin hoef je natuurlijk niet te gebruiken en opslaan hoef je alleen maar te doen als er een stand verandert in totaal heb je 512 bytes aan eeprom
paul deelen
shooter@home.nl
shooter@home.nl
- Marca 1342
- Berichten: 3
- Geregistreerd: 16 Jun 2022, 18:35
Re: eso32 laatste positie behouden na reset
shooter schreef:de oplossing ligt inderdaad bij eeprom geheugen een standaard arduino uno
een testje /*
* EEPROM Write
*
* Stores values read from analog input 0 into the EEPROM.
* These values will stay in the EEPROM when the board is
* turned off and may be retrieved later by another sketch.
*/
#include <EEPROM.h>
/** the current address in the EEPROM (i.e. which byte we're going to write to next) **/
int addr = 0;
void setup() {
/** Empty setup. **/
}
void loop() {
/***
Need to divide by 4 because analog inputs range from
0 to 1023 and each byte of the EEPROM can only hold a
value from 0 to 255.
***/
int val = analogRead(0) / 4;
/***
Write the value to the appropriate byte of the EEPROM.
these values will remain there when the board is
turned off.
***/
EEPROM.write(addr, val);
/***
Advance to the next address, when at the end restart at the beginning.
Larger AVR processors have larger EEPROM sizes, E.g:
- Arduno Duemilanove: 512b EEPROM storage.
- Arduino Uno: 1kb EEPROM storage.
- Arduino Mega: 4kb EEPROM storage.
Rather than hard-coding the length, you should use the pre-provided length function.
This will make your code portable to all AVR processors.
***/
addr = addr + 1;
if (addr == EEPROM.length()) {
addr = 0;
}
/***
As the EEPROM sizes are powers of two, wrapping (preventing overflow) of an
EEPROM address is also doable by a bitwise and of the length - 1.
++addr &= EEPROM.length() - 1;
***/
delay(100);
}
komt direct uit arduino.cc maar de analogin hoef je natuurlijk niet te gebruiken en opslaan hoef je alleen maar te doen als er een stand verandert in totaal heb je 512 bytes aan eeprom
Dank je wel ik denk een stap verder te zijn .
5 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten