Auto reset arduino?

Salve a tutti, ho un problema relativo a questi due, la scheda wemos d1 r2 basata su esp-8266EX e il sensore lm35 (temperatura). (la scheda lavora come tensione di riferimento a 3.3v) Ho fatto questo sketch:

void setup() {
  Serial.begin(9600);
}

void loop() {
  int temp = analogRead(A0);
  Serial.println(temp*3.22265625);
  delay(500);
}

Ho collegato quindi il Vout dell'lm35 nel pin A0. Le misurazioni che mi vengono fornite sono molto "oscillanti" mentre misurando il sensore con un voltmetro misuro da 313mV a 318mV. Sul print registro i seguenti dati in contemporanea:

322.27
319.04
325.49
319.04
322.27
319.04
328.71
322.27
325.49
319.04
325.49
322.27
322.27
319.04
322.27
322.27
322.27
319.04
325.49
319.04
325.49
319.04
328.71
319.04
325.49
322.27
325.49
319.04
325.49
319.04
322.27
319.04
322.27
322.27
325.49
319.04
325.49
319.04
325.49
322.27
325.49
319.04
322.27
319.04
325.49
319.04
322.27
319.04
322.27
322.27
325.49
319.04
325.49
322.27
322.27
319.04
322.27
322.27
322.27
322.27
325.49
315.82
325.49
322.27
325.49
322.27
322.27
319.04
322.27
319.04
325.49
322.27
322.27
322.27
322.27
322.27
322.27
322.27
322.27
322.27
325.49
322.27
325.49
322.27
325.49
322.27
322.27
325.49
322.27
328.71
322.27
325.49
328.71
322.27
325.49
322.27
322.27
325.49
325.49
325.49
325.49
322.27
322.27
325.49
315.82
322.27
325.49
325.49
325.49
325.49
325.49
325.49
325.49
325.49
325.49

Le misurazioni fatte dal wemos, quindi printate sono molto "oscillanti" per esempio da 315 a 322 in solo 500ms di delay (?) Dove sbaglio/come posso migliorare?

Ho "risolto" questo problema, sono riuscito ad ottenere un risultato "ottimale"

Adesso mi serve sapere se è possibile far resettare arduino in automatico solo quando dico io?

Perché resettare?

In effetti è curioso sapere perché vorresti resettarlo…comunque potresti utilizzare il watchdog impostandolo come reset e modificando a quanto tempo deve andare in overflow…sul software dai una logica che ti fa andare in overflow il Watchdog (con un semplice delay())

uwefed:
Perché resettare?

Gianky00:
In effetti è curioso sapere perché vorresti resettarlo…comunque potresti utilizzare il watchdog impostandolo come reset e modificando a quanto tempo deve andare in overflow…sul software dai una logica che ti fa andare in overflow il Watchdog (con un semplice delay())

Ho risolto con Watchdog.
Ho bisogno di resettare prima due wemos poi arduino mega, perchè quando alimento il tutto il wemos per il collegamento wifi mi da timeout, quindi bisogna fare un primo reset, mentre l’altro reset serve per il wemos che mi gestisce la lettura della temperatura e la invia al mega, anche qui riavviando la scheda e dopo riavviando il mega per la prima volta tutto va correttamente.

Infatti ho messo il reset delle schede in dei pin del mega, che li porta a LOW e dopo qualche secondo si auto riavvia

Ops… mi sono reso conto, con alcuni test che quando apro il cancello ed arriva al fine corsa si riavvia tutto!
Credo che potrebbe essere una cosa al riguardo dell’unico delay presente appunto frà un passo e l’altro del motore.
Credo che mandi un timeout quando ci sono troppe uscite HIGH, infatti con le uscite tutte LOW e solo il motore in corsa non succede nulla, quando passo qualche uscita di troppo ad HIGH, arduino crasha, quindi manda la funzione reset causata dal timeout.

void AvvioMotore() {
  switch (cmd_motor)
  {
    case 0:
      digitalWrite(IN1, 0);
      digitalWrite(IN2, 0);
      digitalWrite(IN3, 0);
      digitalWrite(IN4, 0);
    break;

    case 1:
      for (int i = 0; i < 8; i++) {
        digitalWrite(IN1, ((tab2[i] & 0x01) == 0x01 ? true : false));
        digitalWrite(IN2, ((tab2[i] & 0x02) == 0x02 ? true : false));
        digitalWrite(IN3, ((tab2[i] & 0x04) == 0x04 ? true : false));
        digitalWrite(IN4, ((tab2[i] & 0x08) == 0x08 ? true : false));
        delay(1);
      }
    break;

    case 2:
      for (int i = 0; i < 8; i++) {
        digitalWrite(IN1, ((tab1[i] & 0x01) == 0x01 ? true : false));
        digitalWrite(IN2, ((tab1[i] & 0x02) == 0x02 ? true : false));
        digitalWrite(IN3, ((tab1[i] & 0x04) == 0x04 ? true : false));
        digitalWrite(IN4, ((tab1[i] & 0x08) == 0x08 ? true : false));
        delay(1);
      }
    break;
  }
}

(infatti senza l’auto reset non succede nulla, una semplice disconnessione del sito che per quell’attimo, durante la corsa del motore non risponde)

Come trasformo questi delay in millis?
Ovviamente avvio il motore con cmd_motor, 0 per motore spento, 1 per aprire e 2 per chiudere

Help pls ~22h alla presentazione del progetto :P

cosa intendi con "come trasformo questi delay i millis"?

da come lo chiedi sembra che in questo caso ti basti sostituire i delay(1) con millis(1)... altrimenti non capisco cosa vuoi dire...

Lmatte15L: cosa intendi con "come trasformo questi delay i millis"?

da come lo chiedi sembra che in questo caso ti basti sostituire i delay(1) con millis(1)... altrimenti non capisco cosa vuoi dire...

il millis applicato per evitare che il resto dello sketch si blocchi, il delay ferma tutto li per quel tempo, il millis non blocca lo sketch, però scritto cosi non serve, perchè il millis parte subito all'accensione, quindi è già oltre (1), so come applicare il millis, però non riesco ad applicarlo dentro il ciclo for, sempre se possibile, se non è possibile mi serve un'altra soluzione Ho finito con la maturità, ho portato il progetto ed ho stupito i commissari, però per mia soddisfazione personale voglio rendere il progetto più efficiente, magari ampliando le mie conoscenze nel campo