2 loop in uno sketch

Ciao a tutti ho un problemino con uno sketch. Praticamente ho 2 funzioni la prima non da' alcun problema la carico e funziona correttamente qusta funzione principale dovrebbe invocare un'altra funzione all'interno della quale io devo mettere un loop,si può fare??

Ciao Poper

Non puoi definire in un sketch 2 volte la stessa funzione (indipendentemente come si chiama). Le funzioni loop() e setup() sono funzioni uguali a tutte le altre funzioni che definisci, solo che vengono chiamate in automatico (setup() all inizio una volta e loop() di continuo appena finito).

Un altra funzione particolare é quella che definisci nel attachInterrupt(); Quella viene eseguita nel caso si avvera la condizione del interrupt.

Non vedo la necessitá di avere due loop() in un sketch.

Se hai 2 cose che devono essere fatte mettile tutte due nel loop(). Spero che sono stato comprensibile. Se ci sono ancora cose non chiare manda il programma che vuoi fare e descrivilo.

Ciao Uwe

Non so se ho capito bene, ma tu vuoi fare una cosa di questo tipo:

void loop { codice da eseguire prima della funzione se condizione_1 esegui funzione_1 codice da eseguire dopo la funzione }

void funzione_1 { codice da eseguire prima della funzione se condizione 2 esegui funzione_2 codice da eseguire dopo la funzione }

void funzione_2 { codice da eseguire }

Nel loop principale quando si verifica la condizione_1 viene effettuato un salto alla funzione_1 SOLO se sto eseguendo la funzione_1 e ho la condizione 2 viene effettuato un salto alla funzione_2.

Al termine di ogni funzione il programma ritorna alla riga alla riga successiva da dove la funzione è stata chiamata.

si più o meno è come dici tu Ambrogio.

#include <ShiftLCD.h>
ShiftLCD lcd(11, 13, 12);

void scrivi(int,int);

const int pulsante=8; //pin decremento contatore
const int bottone=9; //pin incremento contatore
const int enter=10;
int pin[6]={2,3,4,5,6,7};

int uno[6]={1,0,0,0,0,0};
int due[6]={0,1,0,0,0,0};
int tre[6]={0,0,1,0,0,0};
int quattro[6]={0,0,0,1,0,0};
int cinque[6]={0,0,0,0,1,0};
int sei[6]={0,0,0,0,0,1};

int contatore=256;
int resto=0;
int stato=0;// stato di incremento
int ultimostato=0;
int stato2=0;// stato di decremento
int ultimostato2=0;
int statoenter=0;//stato di enter
int ultimoenter=0;

boolean ok=0;//se ok è high allora procedo con l’esecuzione del comando enter

unsigned long int time=0;
unsigned long int leggo=0;
unsigned long int scrivo=0;

void setup(){

lcd.begin(16, 2);
int out[6]={2,3,4,5,6,7};

for(int i=0;i<6;i++){
pinMode(out*,OUTPUT);*

  • }*

  • pinMode(pulsante,INPUT);*

  • pinMode(bottone,INPUT);*

  • pinMode(enter,INPUT);*

  • leggo=millis();*

  • scrivo=millis();*

  • }*

  • void loop() {*

  • time=millis();*

if(time>leggo+100){

  • stato=digitalRead(bottone);*

  • stato2=digitalRead(pulsante);*

  • statoenter=digitalRead(enter);*

  • if(stato!=ultimostato){ //controllo il pulsante di incremento*

  • if(stato==HIGH){*

  • contatore++;*

  • }*

  • else{*

  • contatore=contatore;*

  • }*

  • ultimostato=stato; *

  • } *

  • if(stato2!=ultimostato2){ //controllo il pulsante di decremento*

  • if(stato2==HIGH){*

  • contatore–;*

  • }*

  • else{*

  • contatore=contatore;*

  • }*

  • ultimostato2=stato2;*

  • }*

  • if(statoenter!=ultimoenter){//controllo il pulsante di enter*

  • if(statoenter==HIGH){*

  • ok=true;*

  • }*

  • else{*

  • ok=false;*

  • }*

  • ultimoenter=statoenter; *

  • }*

  • leggo=millis();*
    }
    if(time>scrivo+50){

  • resto=contatore%6;*

  • switch (resto){*

  • case (0):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led1”);*

  • if(ok){*

  • scrivi(uno,pin);*

  • }*

  • break; *

  • case(1):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led2”);*

  • if(ok){*

  • scrivi(due,pin);*

  • }*

  • break;*

  • case(2):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led3”);*

  • if(ok){*

  • scrivi(tre,pin);*

  • }*

  • break;*

  • case(3):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led4”);*

  • if(ok){*

  • scrivi(quattro,pin);*

  • }*

  • break; *

  • case(4):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led5”);*

  • if(ok){*

  • scrivi(cinque,pin);*

  • }*

  • break; *

  • case(5):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led6”);*

  • if(ok){*

  • scrivi(sei,pin);*

  • }*

  • break; *

  • }*

  • scrivo=millis();*

  • }*

  • }*

//funzione di scritture sui pin

  • void scrivi(int valore,int pin){*

  • if(valore[0]==0){*

  • digitalWrite(pin[0],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[0],HIGH);*

  • }*

  • if(valore[1]==0){*

  • digitalWrite(pin[1],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[1],HIGH);*

  • }*

  • if(valore[2]==0){*

  • digitalWrite(pin[2],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[2],HIGH);*

  • }*

  • if(valore[3]==0){*

  • digitalWrite(pin[3],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[3],HIGH);*

  • }*

  • if(valore[4]==0){*

  • digitalWrite(pin[4],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[4],HIGH);*

  • }*

  • if(valore[5]==0){*

  • digitalWrite(pin[5],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[5],HIGH);*

  • }*

  • }*
    Praticamente è una sorta di menù.Questo dovrebbe diventare la parte principale e permettere di accedere a dei sottomenù quando si verifica una delle condizioni da case 1 a case 6.
    Praticamente a seconda del sotto menù selezionato io dovrei ciclare una struttura simile a quella principale ma che svolga delle diverse funzioni.
    Spero di essermi spiegato

Allora, prima di tutto ti consiglio di usare la funzione Tool > Auto format (CTRL + T) nell'IDE che ti sistema automaticamente tutte le tabulazioni, in questo modo il codice sarà molto più leggibile. ;-)

Non capisco perchè all'inizio hai messo

void scrivi(int[],int[]);

Volevi dichiarare la funzione ? Lo fai già in basso quando la crei:

void scrivi(int valore[],int pin[]){
   codice che verrà eseguito ogni volta che chiami la funzione "scrivi"
  }

Il resto a livello di sintassi mi sembra giusto, tu hai una struttura di questo tipo:

void setup()
{
  ...
}

void loop()
{
  ...
  quando si verifica una determinata condizione esegui la funzione "scrivi" con i parametri "uno" e "pin"
  quando si verifica una determinata condizione esegui la funzione "scrivi" con i parametri "due" e "pin"
  quando si verifica una determinata condizione esegui la funzione "scrivi" con i parametri "tre" e "pin"
  ...
}

void scrivi(int valore[],int pin[])
{
  ...
}

purtroppo non è in quella funzione l’errore

<ShiftLCD.h>
ShiftLCD lcd(11, 13, 12);

void scrivi(int,int);

const int pulsante=8; //pin decremento contatore
const int bottone=9; //pin incremento contatore
const int enter=10;
int pin[6]={
2,3,4,5,6,7};

int uno[6]={
1,0,0,0,0,0};
int due[6]={
0,1,0,0,0,0};
int tre[6]={
0,0,1,0,0,0};
int quattro[6]={
0,0,0,1,0,0};
int cinque[6]={
0,0,0,0,1,0};
int sei[6]={
0,0,0,0,0,1};

int contatore=256;
int resto=0;
int stato=0;// stato di incremento
int ultimostato=0;
int stato2=0;// stato di decremento
int ultimostato2=0;
int statoenter=0;//stato di enter
int ultimoenter=0;

boolean ok=0;//se ok è high allora procedo con l’esecuzione del comando enter

unsigned long int time=0;
unsigned long int leggo=0;
unsigned long int scrivo=0;

void setup(){

lcd.begin(16, 2);
int out[6]={
2,3,4,5,6,7 };

for(int i=0;i<6;i++){
pinMode(out*,OUTPUT);*

  • }*

  • pinMode(pulsante,INPUT);*

  • pinMode(bottone,INPUT);*

  • pinMode(enter,INPUT);*

  • leggo=millis();*

  • scrivo=millis();*
    }
    void loop() {

  • time=millis();*

  • if(time>leggo+100){*

  • stato=digitalRead(bottone);*

  • stato2=digitalRead(pulsante);*

  • statoenter=digitalRead(enter);*

  • if(stato!=ultimostato){ //controllo il pulsante di incremento*

  • if(stato==HIGH){*

  • contatore++;*

  • }*

  • else{*

  • contatore=contatore;*

  • }*

  • ultimostato=stato; *

  • } *

  • if(stato2!=ultimostato2){ //controllo il pulsante di decremento*

  • if(stato2==HIGH){*

  • contatore–;*

  • }*

  • else{*

  • contatore=contatore;*

  • }*

  • ultimostato2=stato2;*

  • }*

  • if(statoenter!=ultimoenter){//controllo il pulsante di enter*

  • if(statoenter==HIGH){*

  • ok=true;*

  • }*

  • else{*

  • ok=false;*

  • }*

  • ultimoenter=statoenter; *

  • }*

  • leggo=millis();*

  • }*

  • if(time>scrivo+50){*

  • resto=contatore%6;*

  • switch (resto){*

  • case (0):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“Antenna”);*

  • if(ok){*

  • antenna;*

  • }*

  • break; *

  • case(1):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led2”);*

  • if(ok){*

  • scrivi(due,pin);*

  • }*

  • break;*

  • case(2):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led3”);*

  • if(ok){*

  • scrivi(tre,pin);*

  • }*

  • break;*

  • case(3):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led4”);*

  • if(ok){*

  • scrivi(quattro,pin);*

  • }*

  • break; *

  • case(4):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led5”);*

  • if(ok){*

  • scrivi(cinque,pin);*

  • }*

  • break; *

  • case(5):*

  • lcd.setCursor(0, 0);*

  • lcd.print(“accendo led6”);*

  • if(ok){*

  • scrivi(sei,pin);*

  • }*

  • break; *

  • }*

  • scrivo=millis();*

  • }*
    }
    //funzione di scritture sui pin
    void scrivi(int valore[],int pin[]){

  • if(valore[0]==0){*

  • digitalWrite(pin[0],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[0],HIGH);*

  • }*

  • if(valore[1]==0){*

  • digitalWrite(pin[1],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[1],HIGH);*

  • }*

  • if(valore[2]==0){*

  • digitalWrite(pin[2],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[2],HIGH);*

  • }*

  • if(valore[3]==0){*

  • digitalWrite(pin[3],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[3],HIGH);*

  • }*

  • if(valore[4]==0){*

  • digitalWrite(pin[4],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[4],HIGH);*

  • }*

  • if(valore[5]==0){*

  • digitalWrite(pin[5],LOW);*

  • }*

  • else{*

  • digitalWrite(pin[5],HIGH);*

  • }*
    }
    void antenna(void){

  • void loop(){*

  • //qui dentro struttura come quella del primo loop*

  • }*
    }
    l’ultima funzione mi da’l’errore.
    ora ho scritto solo il commento ma era la stessa cosa con la funzione completa.
    sketch_oct29a.cpp: In function ‘void antenna()’:
    sketch_oct29a:212: error: a function-definition is not allowed here before ‘{’ token

non devi mettere un altro void loop dentro a void antenna !

se vuoi che la funzione antenna venga eseguita sempre la devi chiamare ad ogni ciclo di loop in questo modo

void setup() { ... }

void loop() { ... antenna(); ... }

void antenna() { ... }

In questo modo lui ad ogni ciclo loop va a chiamare la funzione "antenna"

PS se la funzione antenna non ha nessun parametro non devi scrivere "void antenna(void)" ma "void antenna()"

ma io non voglio che venga eseguita sempre. Vorrei che fosse eseguita solamente nel caso in cui la funzione principale la chiami nel mio caso nel primo caso dello switch. in quel caso deve essere eseguita sempre finche io da input non le do il comando di tornare alla funzione principale

se non vuoi che viene eseguito sempre fai un if.

IF ( condizione) { antenna(); }

Ciao Uwe

e per far eseguire sempre il codice all'interno della funzione come faccio? mi spiego meglio io non voglio eseguire sempre la funzione,ma all'interno di essa devo inserire del codice che deve essere eseguito sempre finche non riceve da input il comando di uscita.

Ho provato nei modi che conoscevo e che mi avete suggerito ma non funziona come dovrebbe.

vi posto il modo in cui vorrei “farlo funzionare”.

#include <ShiftLCD.h>
ShiftLCD lcd(11, 13, 12);

void scrivi(int,int);

const int pulsante=8; //pin decremento contatore
const int bottone=9; //pin incremento contatore
const int enter=10;
int pin[6]={
2,3,4,5,6,7};

int uno[6]={
1,0,0,0,0,0};
int due[6]={
0,1,0,0,0,0};
int tre[6]={
0,0,1,0,0,0};
int quattro[6]={
0,0,0,1,0,0};
int cinque[6]={
0,0,0,0,1,0};
int sei[6]={
0,0,0,0,0,1};

int contatore=256;
int contatorea=7;
int resto=0;
int restoa=0;
int stato=0;// stato di incremento
int ultimostato=0;
int stato2=0;// stato di decremento
int ultimostato2=0;
int statoenter=0;//stato di enter
int ultimoenter=0;

boolean ok=0;//se ok è high allora procedo con l’esecuzione del comando enter

unsigned long int time=0;
unsigned long int leggo=0;
unsigned long int scrivo=0;

void setup(){

lcd.begin(16, 2);
int out[6]={
2,3,4,5,6,7 };

for(int i=0;i<6;i++){
pinMode(out*,OUTPUT);*

  • }*
  • pinMode(pulsante,INPUT);*
  • pinMode(bottone,INPUT);*
  • pinMode(enter,INPUT);*
  • leggo=millis();*
  • scrivo=millis();*
    }
    void loop() {
  • time=millis();*
  • if(time>leggo+100){*
  • stato=digitalRead(bottone);*
  • stato2=digitalRead(pulsante);*
  • statoenter=digitalRead(enter);*
  • if(stato!=ultimostato){ //controllo il pulsante di incremento*
  • if(stato==HIGH){*
  • contatore++;*
  • }*
  • else{*
  • contatore=contatore;*
  • }*
  • ultimostato=stato; *
  • } *
  • if(stato2!=ultimostato2){ //controllo il pulsante di decremento*
  • if(stato2==HIGH){*
  • contatore–;*
  • }*
  • else{*
  • contatore=contatore;*
  • }*
  • ultimostato2=stato2;*
  • }*
  • if(statoenter!=ultimoenter){//controllo il pulsante di enter*
  • if(statoenter==HIGH){*
  • ok=true;*
  • }*
  • else{*
  • ok=false;*
  • }*
  • ultimoenter=statoenter; *
  • }*
  • leggo=millis();*
  • }*
  • if(time>scrivo+50){*
  • resto=contatore%6;*
  • switch (resto){*
  • case (0):*
  • lcd.setCursor(0, 0);*
  • lcd.clear();*
  • lcd.print(“antenna”);*
  • if(ok){*
  • antenna();*
  • }*
  • break; *
  • case(1):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“accendo led2”);*
  • if(ok){*
  • scrivi(due,pin);*
  • }*
  • break;*
  • case(2):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“accendo led3”);*
  • if(ok){*
  • scrivi(tre,pin);*
  • }*
  • break;*
  • case(3):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“accendo led4”);*
  • if(ok){*
  • scrivi(quattro,pin);*
  • }*
  • break; *
  • case(4):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“accendo led5”);*
  • if(ok){*
  • scrivi(cinque,pin);*
  • }*
  • break; *
  • case(5):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“accendo led6”);*
  • if(ok){*
  • scrivi(sei,pin);*
  • }*
  • break; *
  • }*
  • scrivo=millis();*
  • }*
    }
    //funzione di scritture sui pin
    void scrivi(int valore[],int pin[]){
  • if(valore[0]==0){*
  • digitalWrite(pin[0],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[0],HIGH);*
  • }*
  • if(valore[1]==0){*
  • digitalWrite(pin[1],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[1],HIGH);*
  • }*
  • if(valore[2]==0){*
  • digitalWrite(pin[2],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[2],HIGH);*
  • }*
  • if(valore[3]==0){*
  • digitalWrite(pin[3],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[3],HIGH);*
  • }*
  • if(valore[4]==0){*
  • digitalWrite(pin[4],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[4],HIGH);*
  • }*
  • if(valore[5]==0){*
  • digitalWrite(pin[5],LOW);*
  • }*
  • else{*
  • digitalWrite(pin[5],HIGH);*
  • }*
    }
    void antenna(){// funzione che vorrei far funzionare ::slight_smile:
  • restoa=contatorea%3;*
  • void loop() {*
  • time=millis();*
  • if(time>leggo+100){*
  • stato=digitalRead(bottone);*
  • stato2=digitalRead(pulsante);*
  • statoenter=digitalRead(enter);*
  • if(stato!=ultimostato){ //controllo il pulsante di incremento*
  • if(stato==HIGH){*
  • contatorea++;*
  • }*
  • else{*
  • contatorea=contatorea;*
  • }*
  • ultimostato=stato; *
  • } *
  • if(stato2!=ultimostato2){ //controllo il pulsante di decremento*
  • if(stato2==HIGH){*
  • contatorea–;*
  • }*
  • else{*
  • contatorea=contatorea;*
  • }*
  • ultimostato2=stato2;*
  • }*
  • if(statoenter!=ultimoenter){//controllo il pulsante di enter*
  • if(statoenter==HIGH){*
  • ok=true;*
  • }*
  • else{*
  • ok=false;*
  • }*
  • ultimoenter=statoenter; *
  • }*
  • leggo=millis();*
  • }*
  • if(time>scrivo+50){*
  • restoa=contatorea%3;*
  • switch (restoa){*
  • case (0):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“loop”);*
  • if(ok){*
  • antenna();*
  • }*
  • break; *
  • case(1):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“stilo”);*
  • if(ok){*
  • scrivi(due,pin);*
  • }*
  • break;*
  • case(2):*
  • lcd.setCursor(0, 0);*
  • lcd.print(“dipolo”);*
  • if(ok){*
  • scrivi(tre,pin);*
  • }*
  • break;*
  • scrivo=millis();*
  • }*
  • }*
  • if(restoa=3 && ok=true){*
  • return; *
  • } *
  • }*
    }

Ti ripeto che non puoi mettere un void loop dentro alla tua funzione ! L'unico modo di eseguirla continuamente è di chiamarla continuamente dentro al void loop !

Vediamo se riesco ad essere più chiaro: se tu fai una cosa del genere:

void setup() { ... }

void loop() { case 0: ...

case 1: tuaFunzione();

case 2: ... }

void tuaFunzione() { ... }

In questo esempio se il case vale 0 tu non esegui mai la funzione perchè non viene mai chiamata, se vale 1 la esegui continuamente perchè ad ogni ciclo di loop la tuaFunzione viene chiamata, se il case vale 2 la tua funzione non viene mai eseguita perchè non viene mai chiamata

non appena la funzione viene eseguita il controllo viene riceduto alla funzione principale ed automaticamente esce dalla miafunzione. a me serve che il contenuto della funzione venga eseguito...non so come se il comando dell'arduino passase da una funzione all'altra

Non so ma non andrebbe bene che il tuo codice che aspetta l' input sia ripetuto e quando arriva (con la seriale non perdi dati, finiscono in un buffer e vengono trasferiti quando leggi dalla seriale) il comando di uscita esegue il resto del codice del lop()

Un alternativa: potresti usare il comando While, ma blocchi l' esecuzione del resto del codice. http://arduino.cc/en/Reference/While

Ciao Uwe

Si si è proprio questo che vorrei,bloccare una parte del programma principale e mettere in esecuzione solo quello della funzione.

Allora devi usare una struttura di questo tipo:

void setup() { ... }

void loop() { ... while (condizione per eseguire ciò che vuoi) { ciò che vuoi fare solo quando la condizione è verificata } }