Come impostare skecth con due void loop() ?

Salve,avrei bisogno di avere due loop distinti con scelta nel setup posto il codice non funzionante.

[code]
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <MKRGSM.h>
#include <BlynkSimpleMKRGSM.h>
GSMClient client;
GPRS gprs;
GSM gsmAccess;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);
char auth[] = "w2";
char pin[]  = "";
char apn[]  = "in";
char user[] = "";
char pass[] = "";
BlynkTimer timer;
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  if (digitalRead(2) == LOW)  {
    void loop(due)
  } else {
    void loop(uno)
    Blynk.begin(auth, gsmAccess, gprs, client, pin, apn, user, pass);
  }
}
void loop(uno)
{

  timer.run();
  Blynk.run();
}
void loop(due) {

}

[/code]

Non puoi nella setup, fai quel if nella loop() inoltre la loop() e setup() è un nome fisso

#define BLYNK_PRINT Serial
#include <SPI.h>
...
byte QUALERUN=0;    // mia aggiunta

void setup()
{ Wire.begin();
  Serial.begin(9600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  if (digitalRead(2) == LOW)
  { QUALERUN=2;
  } else 
  { QUALERUN=1;
    Blynk.begin(auth, gsmAccess, gprs, client, pin, apn, user, pass);
  }
}

void loop()
{ switch(QUALERUN)
 { case 1: loop1(); break;
   case 2: loop2(); break;
 }
}

void loop1()
{ timer.run();
  Blynk.run();
}
void loop2() 
{ }

Non lo posso fare cosi Blynk chiede un loop cosi come lo postato per problemi di cadute connessioni
frequenti.

void loop(){
Blynk.run();
}

Ti chiede di usare questo tipo di chiamata a tempo per lasciare pulito il loop.

[code]
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
char auth[] = "YourAuthToken";
BlynkTimer timer;
void notifyUptime()
{
  long uptime = millis() / 60000L;
void setup()
{ 
  Serial.begin(9600);
  Blynk.begin(auth); 
  timer.setInterval(60000L, notifyUptime);
}

void loop()
{
  Blynk.run();
  timer.run();
}

[/code]

Guarda che quello che ti ha scritto nid69ita fa esattamente quello che chiedi, solo che ha cambiato il posto dove viene fatto il test semplicemente per rendere l'impossibile, possibile!
E' un pelo meno performante perchè testa quale loop chiamare ad ogni giro, ma meno performante rispetto a qualcosa di impossibile, quindi non se ne lamenterà nessuno :wink:

Maurizio

Il codice funziona ma purtroppo non posso togliere
le funzioni di Blynk dal loop principale ne metterle altre
Avevo già fatto una cosa del genere ma si disconnetteva
Continuamente
Ho fatto un paio di domande sul forum di Blynk mi hanno confermato.....

Non conosco Blynk ma sarei curioso di capire meglio quello che dici, perchè mi sembra mooooolto strano.
Alla fine, il loop principale non è altro che una chiamata fatta da un loop infinito esterno, che non vediamo.
Il vero codice eseguito da arduino è qualcosa del genere, in pseudo codice:

setup();
while(true) {
  loop();
}

Noi vediamo solo le due procedure setup() e loop() in cui possiamo metterci quello che vogliamo, perchè quello che le richiama è codice interno della libreria di base.

Ora, diciamo che vuoi richiamare la funzione x()

Fare:

void setup() {
  while(true) {
    x();
  }
}

oppure

void loop() {
  x();
}

è praticamente la stessa cosa.
x() non dovrebbe accorgersi minimamente della differenza.

Tu sostieni, invece, che mi sbaglio, e io vorrei capire perchè, se possibile.
Puoi darmi qualche dettaglio in più per farmi capire?

Grazie
Maurizio

maubarzi:
Non conosco Blynk ma sarei curioso di capire meglio quello che dici, perchè mi sembra mooooolto strano.

Conosco poco Blynk perché ho sperimentato un poco qualche anno fa e poi mai più usato, ma il fatto qui è che l'OP dice di voler fare una cosa che non si capisce ("doppio loop"?), in un progetto che non ha descritto (non ha ancora detto cosa stia cercando di fare e nel primo post non ha parlato di Blynk), per realizzare qualcosa di diverso che non ha spiegato, e le uniche risposte attualmente possibili già le avete date, ma quando dice che non può togliere le procedure di Blynk né aggiungerne altre, mi pare che la cosa sia in totale contraddizione.

se vuoi fare doppio loop devi mettere dentro al loop uno switch/case. Nel setup scegli quale condizione eseguire.

doppio loop non lo puoi fare, il loop è assimilabile al main() di un’applicazione c++, capisci bene che non puoi creare due main.

poi se mi sbaglio sarei ben felice di essere corretto, non sono nuovo al c++, sono piu fresco con arduino.

>makkio: più che altro l’IDE nasconde il main() che c’è ma non si vede (fa parte del “core” Arduino) e, in tale main() viene chiamata una volta la funzione setup() e, in un FOR infinito, viene chiamata la funzione loop().

Dato che il nome della funzione deve essere univoco, è chiaro che, per non avere errori, DEVE esistere una funzione di nome setup() ed una funzione di nome loop() :wink:

Guglielmo

se proprio vuoi puoi modificare alla riga 154 il file "arduino.h", lancia una ricerca per trovarlo
e aggiungi una riga scritta così:

void loop(int a);

invece alla riga 46 del file "main.cpp"
devi aggiungere una riga tra la 46 e la 47
e questa riga deve essere:

loop(1);

in pratica la metti subito dopo la esistente riga 46

loop();

adesso puoi anzi devi
mettere una seconda loop (ma solo due ne devi mettere)
una sarà del tipo:

loop(){
.
.
.
}

l'altra sarà del tipo:

loop(int a){
.
.
.
}

mi raccomando la scritta tra parentesi

così funziona, fidati

Salvorhardin:
... così funziona, fidati

... certo, function overloading, ma ... l'utilià ? ? ? :o

Per fare quello che lui deve fare non occorre né scomodare il function overloading, né, tantomeno, andare a modificare il "core" ... :wink:

Guglielmo

gpb01:
... certo, function overloading, ma ... l'utilià ? ? ? :o

Ecco, stavo per scriverlo anche io: ma PERCHE'? E poi il core..

Ripeto, l'OP dovrebbe dare un po' di spiegazioni in più, e chiarirci (e chiarirsi, forse...) quali siano i vincoli di Blynk, e perché diamine vorrebbe due loop().
Poi tutto il resto è noia. :wink:

Salve a tutti questo e quello che mi hanno risposto nel forum di Blynk.

As I said, I can see no relationship between the two pieces of code.
It’s not just the delays in the void loo, it’s everything else. Your void loop should be:
void loop()
{
timer.run();
Blynk.run();
}
If you have anything else in there then you’re doing something wrong.

Pete.

Secondo me, nel loop, dopo Blynk.run(); puoi metterci quello che vuoi.
Devi però dichiarare i vari oggetti di Blynk nel setup e poi usarli con i valori aggiornati da quello che probabilmente
c'è dentro la Blynk.run();

Guardati questo link.

Maurizio

maubarzi:
Devi però dichiarare i vari oggetti di Blynk nel setup e poi usarli con i valori aggiornati da quello che probabilmente c'è dentro la Blynk.run();

Non credo ci sia bisogno (se il progetto è in Blynk avrà i suoi include), ma tuttora non abbiamo capito (perché l'OP non lo ha spiegato) in pratica cosa voglia fare.
D'altronde nel link che hai messo tu c'è spiegato cosa altro si può fare, e sono progetti che usano proprio Blynk quindi quella risposta che "se nel loop c'è altro è sbagliato" è una cazzata.

maubarzi:
Secondo me, nel loop, dopo Blynk.run(); puoi metterci quello che vuoi.
Devi però dichiarare i vari oggetti di Blynk nel setup e poi usarli con i valori aggiornati da quello che probabilmente
c'è dentro la Blynk.run();

Guardati questo link.

Maurizio

ciao se vedi negli esempi di Blynk non vanno fatti cosi ci devi mettere sempre una chiamata a tempo del loop...

Posto link del sito dove travate tutto.https://docs.blynk.cc/

Tutto molto bello, ma ci spieghi perché parli di "due loop"? A volte non si deve partire dalla soluzione trovata (che non hai trovato, comunque) ma dal problema da risolvere: cosa stai cercando di fare?

docdoc:
Tutto molto bello, ma ci spieghi perché parli di "due loop"? A volte non si deve partire dalla soluzione trovata (che non hai trovato, comunque) ma dal problema da risolvere: cosa stai cercando di fare?

Buongiorno, sto cercando di fare due codici indipendenti cioè se all'accenzione tieni premuto un pulsante
il programma funziona senza bisogno di connessione ne cercherà di connettersi al server,
per quando riguarda il loop, facendo una chiamata a tempo impostata nel setup e non inserendo niente nel loop principale funziona ,ma si e presentato un'altro problema,che Blynk tenta di connettesi al server nel setup se viene inibito quando entra nel loop si blocca tutto.