Sfarfallio LED con countdown timer

Ciao a tutti, premetto che prima di rivolgermi qui ho cercato é letto molto riguardo al mio problema.

Spero di non averlo fatto male

Ho preparato hardware (ESP8266 - NomdeMCU) e sketch per gestire alcne automazioni garage

La funzione che mi da noie é, al premere di un pulsante il led resta acceso per X tempo impostato nella variabile (millis e non delay)

Funziona tutto OK, ma da quando ho introdotto la funzione di un countdown la luce del LED non rimane più fissa mentre il countdown conta.
Mi pare che durante lo scorrere dei millis ci sia una interferenza come delle impercettibile interruzioni di tensione sul pin out che generano questo blynk talmente veloce che sembra uno sfarfallio

Se elimino il countdown nessun problema

Ho anche provato in uscita sul pin ad utilizzare un fotoaccoppiatore ma il risultato é naturalmente identico

Qui di seguuito parte del codice

Grazie per un aiuto

void setup()
{
  // Debug console
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,13), 8080);
  
  pinMode(D1,OUTPUT); //GPIO5
  pinMode(D2,OUTPUT); //GPIO4
  pinMode(D3,OUTPUT); //GPIO0
  pinMode(2,INPUT_PULLUP); //GPIO2   modificato
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  digitalWrite(D1,HIGH);
  digitalWrite(D2,HIGH);
  digitalWrite(D3,LOW);
  //digitalWrite(D4,LOW);
  digitalWrite(13,LOW);
  //digitalWrite(12,LOW);


 }
unsigned long t1, dt, count;
bool RUN = false;
  
  long hold_1 = 500;
  long hold_2 = 8000; // <--- inserisci il valore del tempo di HOLD TIME-OUT in millisecondi

  long hours = 0;
  long mins = 0;
  long secs = 0;
  String secs_o = ":";
  String mins_o = ":";


void loop() {
  
  dt = millis() - t1;
  count = (hold_2 - dt) / 1000;


  secs = count; // set the seconds remaining
  mins = secs / 60; //convert seconds to minutes

  if (secs < 10) {
    secs_o = ":0";
  }
  if (mins < 10) {
    mins_o = ":0";
  }

  
  if ((dt >= hold_1) && RUN) {
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
    Serial.println("accendo");
    Blynk.virtualWrite(V10, mins + secs_o + secs +"\r\n");

  }

  dt = millis() - t1;
  if ((dt >= hold_2) && RUN) {
    Serial.println("fine ciclo");
    Blynk.virtualWrite(V10, "** ** **");
    RUN = false;
  }

  //verifica innesco task
  if (digitalRead(2)) {
    t1 = millis();
    Serial.println("pulsante");
    delay(100);
    RUN = true;
  }
  Blynk.run();
  
 }

Scusa, io non vedo dove lo spegni, il led

Il led é sul pin 13?

Prova a mettere tutto il codice, e anche un'idea di schema

Ciao,

sono due led uno sul pin 12 e l'altro sul 13.

Si accendono e si spengono a fine ciclo

il problema é durante la fase di "acceso" insieme alla esecuzione del timer / countdown; se elimino il countdown è tutto OK

La parte del codice in alto omessa riguarda la definizione delle librerie ed i settaggi per WiFi e tokhen per Blynk

Scusa, ma io nel tuo programma non vedo alcun

Digitalwrite( 13 , LOW)

Quindi?

Dove spegni i led?

Altra domanda:
Il problema te lo fa anche il led sul 12 oppure solo quello il 13?

Inoltre, non usare String! fai virtualWrite separati, interponendo if (minuti==0) virtualWrite(...);

Rispondo ad entrambi.

Ho anche messo inizialmente il digitalWrite(13, LOW); .... il problema non lo risolvo
La porta é settata di default in LOW
Ripeto il problema é durante l'accensione e lo fa per entrambi i LED sia sul pin 12 che 13

Per quanto riguarda lo string non credo risolva il problema

Prima di scrivere qui ho porvato anche altri due sketch in logica di variabili e void fuori dal ciclo loop .... ma il risultato non cambia

Grazie per il vostro aiuto
C

Il problema non lo risolvi perché non lo inquadri

Io comunque ti ho chiesto e tu hai risposto

La risposta non corrispondeva alla domanda, ma non ci posso fare nulla

Ho parlato

Standardoil:
Scusa, ma io nel tuo programma non vedo alcun
Digitalwrite( 13 , LOW) ...

Standardoil:
Il problema non lo risolvi perché non lo inquadri
Io comunque ti ho chiesto e tu hai risposto ...

Forse avrò frainteso io la domanda, ma cercherò di rispondere meglio:

Standardoil:
Scusa, ma io nel tuo programma non vedo alcun
Digitalwrite( 13 , LOW) ...

Quindi dopo il tuo suggerimento, questa mattina ho aggiunto il comando digitalWrite(13, LOW) e digitalWrite(12, LOW); il problema non si risolve

Standardoil:
Dove spegni i led?

Come scritto sopra ho aggiunto il digitalWrite LOW dopo il tuo suggerimento; ma anche prima si spegneva a fine ciclo del timer non bloccante

Standardoil:
Il problema te lo fa anche il led sul 12 oppure solo quello il 13?

me lo fa su entrmbi i PIN

Mi potresti dare una mano ad inquadrare il problema?

Grazie in anticipo.
C

Cristiano, per cortesia, abbrevia all'indispensabile ciò che riporti, affinché soprattutto chi legge da dispositivi mobili non debba scorrere tutto il testo.
Grazie.

@ Datman perdonami ma dovevo chiarire
C

Invece di commentare tutto il codice di countdown, prova a commentare solo parti del codice, esempio le serial.print e Blynk.virtualWrite
I pin gpio 12 e 13 sono la seconda SPI


P.S. Ma il pulsante su pin 2 lo premi ?

Ma se mancava la

digitalWrite(13 , LOW);

chi è che spegneva il led?
Forse è lo stesso elfo cattivo che lo fa lampeggiare?

String è una brutta cosa, da evitare, ma per altri motivi.
Il suggerimento era gratuito come le bonus track.

Maurizio

>cri_stiano: ho modificato io il tuo post #7 per farti vedere come si fa ... tienilo presente per il futuro dei tuoi QUOTE. Grazie.

Guglielmo

@gbp01 Grazie Guglielmo per la dritta

@nid69ita, quando parli di seconda SPI a cosa ti riferisci nello specifico? Chip , clock o altro?

Il codice del timer non bloccante é OK (almeno credo) ... il digitalWrite LOW l'ho aggiunto

Il serialprint é per fare un check su serial monitor

Appena aggiungo il Blynk.virtualWrite per visualizzare il conteggio sul widget display di Blynk mi dà quel problema

Quando si parla di cose strane del genere e c'è Blynk, il responsabile è sempre lui! :frowning:

cri_stiano:
Appena aggiungo il Blynk.virtualWrite per visualizzare il conteggio sul widget display di Blynk mi dà quel problema

quindi abbiamo trovato il responsabile, mi pare. :slight_smile:

Ti consigliavo di levare i comandi uno alla volta per trovare il responsabile, poteva essere anche la serial.print oppure lo spi attivo del nodemcu (che NON è una scheda Arduino e non la conosco)

nid69ita:
Ti consigliavo di levare i comandi uno alla volta per trovare il responsabile, poteva essere anche la serial.print oppure lo spi attivo del nodemcu (che NON è una scheda Arduino e non la conosco)

faro queste prove e vi aggiornerò

Grazie