buonasera... volevo chiedere una cosa. Esiste un modo per far ritornare Arduino ad un certo punto del loop quando per esempio premo un pulsante?? grazie in anticipo
... strutturare come si deve il programma !
Il loop() viene sempre ripetuto dall'inizio alla fine, quindi, basta racchiudere in una sezione condizionata ciò che non si vuole che venga eseguito o, ancora meglio, creare una serie di stati ed eseguire solo quelli necessari.
Cosa devi fare esattamente ?
Guglielmo
Spiega meglio cosa vuoi fare/ottenere perché detta così non è molto comprensibile, se il tuo scopo è terminare premanuramente un delay() la risposta è no non puoi, devi rivedere il codice con l'utilizzo della funzione millis().
Preceduto di poco da gpb01
l'idea sarebbe questa: sul monitor seriale viene visualizzata una frase, dopodiché quando io premo un pulsante sul monitor seriale dovrebbe riapparire sempre la solita frase. non so se mi sono spiegato bene perché non è facile da spiegare.
Ti sei spiegato molto male, ma credo tu ti riferisca al codcie di questa'altra tua discussione
Quindi se il tuo scopo è quello di non aspettare il secondo del delay per visualizzare la scritta devi fare quello che ti ha suggerito Guglielmo in prima battuta e poi da me in seconda battuta ovvero struttura meglio il programma e togli i delay altrimenti non puoi ottenere ciò che desideri ottenere
cioè quello che devo fare spiegato meglio è questo: sul monitor seriale viene scritta una domanda. dopo dieci secondi viene scritta sul monitor seriale la risposta. poi se viene premuto un pulsante sul monitor seriale viene proposta un' altra domanda,altrimenti se premo un altro pulsante sul monitor seriale deve apparire la stessa domanda fatta in partenza.
Quindi ... hai un elenco di domande (DOVE? in un array?), dai dei pulsanti (QUANTI? due soli?), parti dalla prima domanda, dopo 10 secondi dai la risposta e leggi di .. DUE? ... pulsanti ... se viene premuto il primo avanzi alla prossima domanda, se viene premuto il secondo ripeti la stessa. TUTTO QUI ? ... perché se vuoi un aiuto devi dirla tutta eh !
Guglielmo
si praticamente l'idea sarebbe questa.
E di tutto ciò ce vorresti fare hai già buttato giù qualcosa oppure non hai neanche una linea di codice scritta? Se hai qualcosa postalo, altrimenti inizia a scrivere il codice senza usare delay() e posta eventuali intoppi in cui di vai a trovare
... beh, allora mi sembra abbastanza semplice ...
- prima di entrare nel loop() inizializzi l'indice dell'array delle domande a 0
- nel loop fai la domanda, aspetti 10 secondi, dai la risposta
- leggi i due bottoni sino a quando uno non è premuto
3.1 se è premuto il primo incrementi l'indice dell'array (se vai oltre la fine ricominci da 0) e il loop() ricomincia
3.2 se è premuto il secondo NON incrementi l'indice e quindi viene riproposta la stessa domanda e la stessa risposta
Guglielmo
int pulsante=7;
int pulsante1=8;
int frase1="laura goes to school";
int frase2="i play football two days a week";
int frase3= "luca drives a car";
int frase4="luigi eats an apple every day";
int frase5="i do my homework every day";
int frase6=" i meet my friends once a week";
int stato;
int stato1;
int conteggio;
void setup() {
pinMode(pulsante,INPUT);
pinMode(pulsante1,INPUT);
Serial.begin(9600);
Serial.println("welcome to a new way for improve your english");
delay(4000);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop() {
conteggio=0;
randomSeed(millis());
int c=random(1,6);
if(c=1){
Serial.println("laura goes to school");
delay(2000);
Serial.println("put this question in the reported speech");
delay(5000);
Serial.println("laura said she goes to school");
}
stato=0;
stato1=0;
while(stato==0 && stato1==0){
stato=digitalRead(pulsante);
stato1=digitalRead(pulsante1);
Serial.println("sono nel while");
delay(1000);
}
if(stato==1){
Serial.println("good,you can pass at the next question");
conteggio=conteggio+1;
}
delay(200);
if(conteggio==10){
Serial.println(" bravo, sei a 10 giuste");
}
else if(stato1==1){
Serial.println("error,try again");
delay(3000);
conteggio=0;
}
Serial.println(conteggio);
delay(1000);
/////////////////////////////////////////////////////////////
if(c=2){
Serial.println("i play football");
delay(2000);
Serial.println("put this question in the reported speech");
delay(5000);
Serial.println("he said that he played football");
}
stato=0;
stato1=0;
while(stato==0 && stato1==0){
stato=digitalRead(pulsante);
stato1=digitalRead(pulsante1);
Serial.println("sono nel while");
delay(1000);
}
if(stato==1){
Serial.println("good,you can pass at the next question");
conteggio=conteggio+1;
}
delay(200);
if(conteggio==10){
Serial.println(" bravo, sei a 10 giuste");
}
else if(stato1==1){
Serial.println("error,try again");
delay(3000);
conteggio=0;
}
Serial.println(conteggio);
delay(1000);
}
>danielelamanna: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).
Guglielmo
... dopo di che ... vedo che hai fatto come ti pare e NON hai seguito uno che uno dei suggerimenti che ti sono stati dati.
Non vedo un array di domande, non vedo un array di risposte, vedo solo un programma che, ad esempio, crea problemi già solo se si vogliono aggiungere un paio di domande e di risposte.
Per me ... quel programma puoi cestinarlo e ricominciare da capo ... vedrai che farai meglio
Guglielmo
anche in questa semplice riga mi sa che c'è qualcosa da rivedere
int frase1="laura goes to school";
non contando che poi non utilizzi la variabile in nessuna parte del programma
Ma il compilatore non dovrebbe dare errore nel definire una variabile int e assegnargli una stringa?
Mi rispondo da solo.... ho provato questo codice e vediamo chi indovina cosa stampa sul serial monitor....
int frase1="laura goes to school";
void setup() {
Serial.begin(38400);
}
void loop() {
Serial.println(frase1);
delay(2000);
}
NON ho provato (... sono di corsa), provo a ragionare ...
... mette nel "int" l'indirizzo della stringa (valore del puntatore) ?
Che valore ti stampa ?
Guglielmo
stampa 535 ma sinceramente non ho idea del perchè :o
Il valore dipende dalla scheda che usi per la prova e da dove il compilatore ha messo quella stringa in memoria ...
Guglielmo
Ecco, osservate i valori stampati sul monitor seriale ...
char stringa[] = "ABCDEFGHIJKLM";
int valore;
void setup() {
delay(500);
Serial.begin(9600);
valore = stringa;
Serial.print("Contenuto stringa: ");
Serial.println(stringa);
Serial.print("Indirizzo stringa: ");
Serial.println(valore);
Serial.print("Stringa puntata: ");
Serial.println((char *) valore);
}
void loop() {
}
Guglielmo
ho usato una mega, con il tuo programma mi restituisce 512 come indirizzo, questa invece non ho capito come fa da un int a restituire la stringa di char
Serial.println((char *) valore);
legge il carattere e lo visualizza come char all'indirizzo indicato in valore, ma non dovrebbe leggere un solo carattere? Eeeeh ce ne sono di cose da imparare
-zef-:
... questa invece non ho capito come fa da un int a restituire la stringa di charSerial.println((char *) valore);
Semplice, valore contiene l'indirizzo di memoria di dove inizia la stringa ... nel Serial.println() come vedi c'è un 'cast' che dice al compilatore di trattare quel valore NON come un 'int', ma come il puntatore ad un char (ovvero una stringa classica del 'C'). A quel punto è come se avessi scritto Serial.println(stringa) ...
Guglielmo