2 sketch attivati alternativamente al reset, come?

e' possibile fare in modo che arduino esegua un loop ad un reset e ne esegua un altro al successivo reset?

esempio accendo arduino ed esegue un blink di 1 secondo

clicco reset e arduino esegue un blink di 2 secondi

clicco reset ed esegue il primo blink di 1 secondo

e cosi' all'infinito ad ogni pressione di reset

Io creerei due funzioni diverse: loop1 loop2, quando ne esegui uno scrivi da qualche parte nella eeprom "1" ad esempio e così via..
Quindi nello sketch nel setup leggi cosa c'è scritto nella eeprom e di conseguenza nel vero loop richiami quella funzione(che poi sarebbe il tuo loop)

Ricordatevi delle max scritture su EEPROM, 10.000 volte.
Forse più che un reset è meglio un pulsante che alterna le 2 funzioni dette da sciorty.

sciorty ho capito concettualmente quello che hai detto anche se non so come metterlo in pratica non avendo mai usato la eprom, e come diceva leo mi chiedevo quanto si possa scriverci sopra

piu' che un pulsante a questo punto meglio uno switch che va sugli analogici

idea stramba, se io metto una resistenza e condensatore che si carica lentamente (secondi) all'avvio avrei una lettura low sul condensatore e potrei fare un loop1, al reset successivo mi trovo il condensatore carico, avrei una lettura high e potrei far partire il loop2, nel loop2 faccio scaricare anche il condensatore e ritorno al reset successivo alla condizione di partenza. potrebbe funzionare?

reizel:
sciorty ho capito concettualmente quello che hai detto anche se non so come metterlo in pratica non avendo mai usato la eprom, e come diceva leo mi chiedevo quanto si possa scriverci sopra

Ci si può scrivere 10000 volte come detto da leo ma a parer mio se è per questi scopi tanto vale usarla (a meno che la tua applicazione non si resetti ogni secondo)

Comunque una cosa così:

#include <EEPROM.h>

int val;

void loop1(){}
void loop2(){}

void setup(){
  //tramite un altro sketch (o adattando il codice) metti nella cella 0 il valore 1 o 2, di default non so quanto sia..
  val=EEPROM.read(0); 
}

void loop(){
  if(val==1){
   EEPROM.write(0,1);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,2);
   loop1();
  }   
}

grazie 1000 sciorty, ora me lo studio

cmqe la eeprom sarebbe piu' utile per caricarci una password e interrogarla se e' giusta e cambiarla ogni tanto, come la userei io non ha molto senso e la rovini per niente

altrimenti servirebbe una ram di qualche bit (esistono?)

Però effettivamente devi rivedertelo, così com'è ogni volta che arriva all'ultima riga del loop1 o loop2 torna nel loop e scrive sulla EEPROM.. la mia era solo un'idea :cold_sweat:

EDIT: tipo:

#include <EEPROM.h>

int val;

void loop1(){....}
void loop2(){}

void setup(){
  //tramite un altro sketch (o adattando il codice) metti nella cella 0 il valore 1 o 2, di default non so quanto sia..
  val=EEPROM.read(0); 
  boolean primo=true;
}

void loop(){
  if(val==1){
   if(primo){EEPROM.write(0,1);primo=false}
   loop1();
  }
  if(val==2){
   if(primo){EEPROM.write(0,2);primo=false}
   loop1();
  }   
}

secondo me devi invertire i numeri.

void loop(){
  val=EEPROM.read(0); 
  if(val==1){
   EEPROM.write(0,2);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,1);
   loop2();
  }   
}

Ovviamente le funzioni loop1 e loop2 devono avere all loro interno un ciclo infinito e percui non terminare mai.

Ciao Uwe

ottimo, grazie, sto imparando ad usare l'eeprom intanto

avete ragione, il loop non deve finire mai altrimenti scrive sempre e in 3 minuti fai 10000 scritture :sweat_smile:

metto un deviatore e scelgo il loop che voglio, la eeprom la usero' per altro

reizel:
avete ragione, il loop non deve finire mai altrimenti scrive sempre e in 3 minuti fai 10000 scritture :sweat_smile:

Vabbè non per forza, se hai particolari problemi a non farlo finire puoi usare l'ultimo codice.. ogni fine loop1/2 rientra nel loop ma solo per il controllo e non scrive
Ovviamente ti rallenta :slight_smile:

uwefed:
secondo me devi invertire i numeri.

void loop(){

val=EEPROM.read(0);
  if(val==1){
   EEPROM.write(0,2);
   loop1();
  }
  if(val==2){
   EEPROM.write(0,1);
   loop2();
  }   
}



Ovviamente le funzioni loop1 e loop2 devono avere all loro interno un ciclo infinito e percui non terminare mai.

Ciao Uwe

Metti

for(;;) loop1();

e

for(;;) loop2();

reizel:
altrimenti servirebbe una ram di qualche bit (esistono?)

Potresti usare un semplice DS1307 con una batteria tampone. Ha qualche decina di byte di RAM usabile in cui memorizzare il tuo flag, che verrebbe mantenuto anche in caso di assenza di alimentazione principale grazie alla batteria tampone.

leo72:

Potresti usare un semplice DS1307 con una batteria tampone. Ha qualche decina di byte di RAM usabile in cui memorizzare il tuo flag, che verrebbe mantenuto anche in caso di assenza di alimentazione principale grazie alla batteria tampone.
[/quote]

non sapevo questo del ds1307, ne ho 5 in casa, mi guardo il datasheet, s'impara sempre qualcosa :wink: