Widget Led non si accende

Ho un nuovo problema con lo sketch che sto sviluppando.
Lo sketch ha associato alla variabile "scorre" un widget "Led" che dovrebbe accendersi se la variabile "acqua" va a 0 , ma questo non succede.
Il Led rimane spento.
Lo sketch è il seguente:

#include "arduino_secrets.h"
  /* 
    Sketch generated by the Arduino IoT Cloud Thing "Untitled"
    https://create.arduino.cc/cloud/things/472e2e5a-de8c-4845-ac77-ecbd7000c14b 
  
    Arduino IoT Cloud Variables description
  
    The following variables are automatically generated and updated when changes are made to the Thing
  
    int erogazioni;
    bool scorre;
  
    Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
    which are called when their values are changed from the Dashboard.
    These functions are generated with the Thing and added at the end of this sketch.
  */
  
  #include "thingProperties.h"
  
  unsigned long precedenteMillis = 0;
  unsigned long correnteMillis = 0;
  const long intervallo = 10000;
  const int sharp = A1; // sensore
  const byte rele = 2;  // (D2) pin 5
  const int acqua = 5; // (D5) pin 8
  int soglia =  900;  //  90 uguale a 10 cm
  int valore = 0;
  
   void Azzera(){
      erogazioni = 0; 
      }
    
  void setup() {
    // Initialize serial and wait for port to open:
    Serial.begin(9600);
    // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
    delay(1500); 
  
    // Defined in thingProperties.h
    initProperties();
  
    // Connect to Arduino IoT Cloud
    ArduinoCloud.begin(ArduinoIoTPreferredConnection);
    
    setDebugMessageLevel(2);
    ArduinoCloud.printDebugInfo();
    
    /*==========     Azzera le erogazioni      =================*/
    ArduinoCloud.addCallback(ArduinoIoTCloudEvent::SYNC, Azzera); 
     
    pinMode(sharp, INPUT);
    pinMode(acqua, INPUT_PULLUP);
    pinMode(rele, OUTPUT);
    digitalWrite(rele, HIGH); // relè caduto
  }
  
  void loop() {
    ArduinoCloud.update();
    correnteMillis = millis();
    
    /*for(int i=0;i<10;i++){ 
    valore = analogRead(sharp);
      valore = valore + valore;
    valore = valore / 10;
    }*/
    
    valore = analogRead(sharp);
    Serial.println(valore);
    
    // SE motore spento E lettura alta: carica tempo, accendi motore
    if((digitalRead(rele) == HIGH) && (valore >= soglia)){  
        precedenteMillis = correnteMillis;
        digitalWrite(rele, LOW);  // relè attrato
        erogazioni++;
      }

    // SE motore acceso E trascorso tempo: spegni motore
    else if(digitalRead(rele) == LOW) {
       if(correnteMillis - precedenteMillis > intervallo){ 
       digitalWrite(rele, HIGH);  // relè caduto
        valore = 0;
      }
    }
    
    int acquaVal = digitalRead(acqua);
    Serial.println(acquaVal);
    if(acquaVal == 0){
      digitalWrite(scorre, true);
    }
    else{
      digitalWrite(scorre, false);
    }
    delay(1);
   }
   
  /*
    Since Erogazioni is READ_WRITE variable, onErogazioniChange() is
    executed every time a new value is received from IoT Cloud.
  */
  void onErogazioniChange()  { 
  
  }
  
  /*
    Since Scorre is READ_WRITE variable, onScorreChange() is
    executed every time a new value is received from IoT Cloud.
  */
  void onScorreChange()  {
   
  }

Ho bisogno di un consiglio per capire dove sbaglio.

EzioGi

Io vedo un po' di cose diciamo "strane", non sono proprio tutti errori (tranne uno), ma insomma, perdonami ma mi sembra che ci sia un po' di confusione su alcune cose...

Per dire, la digitalRead() restituisce un "int" ma di fatto i valori sono solo LOW e HIGH che sono dei simboli predefiniti: perché lo confronti con zero? Non è errato, visto che LOW vale proprio 0 (e HIGH vale 1) ma ti consiglio di usare sempre LOW e HIGH quando leggi e confronti quei valori.
Poi la stessa cosa per scrivere con la digitalWrite(), tu qui usi "true" e "false", quando in realtà dovresti usare "HIGH" e "LOW":

      digitalWrite(scorre, true);

Ma la cosa è che la variabile "scorre", che qui usi come numero di pin è dichiarata "bool scorre;"!
Una cosa sono i numeri di pin, un'altra un valore legato a qualcosa che ad esempio leggi o imposti.
Quindi temo che tu debba chiarirti un poco meglio le idee di cosa vuoi fare e come queso si debba implementare, separando i riferimenti ai pin dai valori, e questi ultimi, se riferiti a digitalRead(), indicali sempre come HIGH o LOW. Se hai un input impostato INPUT_PULLUP, puoi anche fare tuoi simboli per semplificare il fatto che HIGH significa non premuto, e LOW premuto, ad esempio una cosa del tipo:

#define PREMUTO LOW
#define RILASCIATO HIGH
...
  if (digitalRead(PinPulsante) == PREMUTO) {
    ...

Aggiungo alle giuste cose che ti ha detto docdoc (ed in parte le riprendo), pulizia sul nome delle variabili, distinguendo pin e valori:

unsigned long precedenteMillis = 0;
unsigned long correnteMillis = 0;
const unsigned long intervallo = 10000;                     anche lui unsigned
const byte pinSharp = A1; // sensore
const byte pinRele = 2;  // (D2) pin 5
const byte pinAcqua = 5; // (D5) pin 8
const int sogliaSharp =  900;  //  90 uguale a 10 cm        meglio costante
int valSharp = 0;                                           era il tuo valore
byte valAcqua = 0;                                          era il tuo acquaVal 

Inoltre... come fa a compilarti ? Manca la dichiarazione di "erogazioni" e di "scorre"

Intanto grazie per i consigli.
Ho fatto le modifiche che mi avete consigliato, compreso i riferimenti tra pin e valori.
Premetto che sto sviluppando lo sketch dentro al Cloud di Arduino e fino ad ora ho sempre compilato lo sketch senza problemi, tranne quando ci sono degli errori evidenti.
Anche perché le definizioni delle due variabili “erogazioni e scorre” sono in uno dei file che il Cloud crea automaticamente e si chiama “thingProperties.h.
Come widget uso un contatore che si incrementa regolarmente quando si attiva il motore.
L’altro widget è quello di un Led che dovrebbe accendersi ogni volta che la variabile “pinAcqua” va bassa di valore.
Per fare ciò uso due fili elettrici di cui uno messo a massa e l’altro associato al “pinAcqua” dove è messo positivo tramite il “INPUT_PULLUP”.
Quando scorre l’acqua nella fontanella, i due fili si trovano immersi e il “pinAcqua” va a massa.
Adesso uso un pulsante per simulare lo scorrere dell’acqua, mettendo il filo a massa.
Lo so che è un sistema “spartano” ma al momento non mi è venuto in mente altro.
La variabile “scorre” associata al Widget Led dovrebbe farlo accendere, cosa che non avviene.
Questo è il mio attuale problema che non so come fare per risolvere.
La variabile “scorre” se la definisco “int” poi non la vedo più quando tento di associarla al Widget Led, mentre se la definisco “bool” riesco a farlo.
Il tutto mi serve per capire che il motore funziona regolarmente e che l’acqua fluisce attraverso la fontanella.
Ho fatto un sistema simile con un Arduino NANO e funziona regolarmente da ormai alcuni anni.
Adesso vorrei svilupparlo con un Arduino NANO33 IoT, per avere una situazione chiara quando sono lontano da casa per alcuni giorni.
Il prossimo fine settimana compilo lo sketch con le nuove variazioni consigliate, poi pubblico i risultati e lo sketch..

EzioGi

Risolto!
Grazie all'aiuto degli amici qui del Forum.
Il Widget led si accende e ho anche aggiunto un Widget Message.
Se lo sketch dovesse interessare a qualcuno, posso inserirlo in questa discussione.
Ovviamente non mi assumo nessuna responsabilità per un eventuale malfunzionamento ne eventuali danni che lo sketch può arrecarvi.

EzioGi

Certo, lo spirito del forum è condividere anche come un problema è stato risolto, per aiutare chi dovesse trovarsi nella stessa situazione, per cui si, posta tranquillamente il codice e magari pure due righe per spiegare quale fosse il problema.

Il problema del "Vidget Led" l'ho risolto andando a leggermi quello che si trova nel: https://docs.arduino.cc/arduino-cloud/cloud-interface/dashboard-widgets/.
Mi è bastato seguire l'esempio che c'è li e ha funzionato.
Mi sono dovuto arrangiare con l'inglese che non è il mio forte.
Lo sketch che sottoporrò a un po di test, per verificarne l'affidabilità è il seguente:

  #include "arduino_secrets.h"
  /* 
    Sketch generated by the Arduino IoT Cloud Thing "Untitled"
    https://create.arduino.cc/cloud/things/472e2e5a-de8c-4845-ac77-ecbd7000c14b 
  
    Arduino IoT Cloud Variables description
  
    The following variables are automatically generated and updated when changes are made to the Thing
  
    String messageString;
    int erogazioni;
    bool scorre;
  
    Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
    which are called when their values are changed from the Dashboard.
    These functions are generated with the Thing and added at the end of this sketch.
  */
  
  #include "thingProperties.h"
  
  unsigned long precedenteMillis = 0;
  unsigned long correnteMillis = 0;
  unsigned long intervallo = 30000;
  const int pinSharp = A1; // sensore
  const byte pinRele = 2;  // (D2) pin 5
  const int pinAcqua = 5; // (D5) pin 8
  const int sogliaSharp =  90;  //  90 uguale a 10cm
  int valSharp = 0;
  int valAcqua = 0;
  
   void Azzera(){
      messageString = PropertyActions::CLEAR;
      erogazioni = 0; 
      }
    
  void setup() {
    // Initialize serial and wait for port to open:
    Serial.begin(9600);
    // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
    delay(1500); 
  
    // Defined in thingProperties.h
    initProperties();
  
    // Connect to Arduino IoT Cloud
    ArduinoCloud.begin(ArduinoIoTPreferredConnection);
    
    setDebugMessageLevel(2);
    ArduinoCloud.printDebugInfo();
    
    /*========== Azzera le erogazioni         =================*/
    ArduinoCloud.addCallback(ArduinoIoTCloudEvent::SYNC, Azzera); 
    //messageString = PropertyActions::CLEAR;
     
    pinMode(pinSharp, INPUT);
    pinMode(pinAcqua, INPUT_PULLUP);
    pinMode(pinRele, OUTPUT);
    digitalWrite(pinRele, HIGH); // relè caduto
    Serial.println("Fontanella v3.2");
  }
  
  void loop() {
    ArduinoCloud.update();
    correnteMillis = millis();
    
    for(int i=0;i<10;i++){ 
    valSharp = analogRead(pinSharp);
    valSharp = valSharp / 10;
    }
    
    //valSharp = analogRead(pinSharp);
    Serial.println(valSharp);
    
    // SE motore spento E lettura alta: carica tempo, accendi motore
    if((digitalRead(pinRele) == HIGH) && (valSharp >= sogliaSharp)){  
        precedenteMillis = correnteMillis;
        digitalWrite(pinRele, LOW);  // relè attrato
        erogazioni++;
      }
    // SE motore acceso E trascorso tempo: spegni motore
    else if(digitalRead(pinRele) == LOW) {
       if(correnteMillis - precedenteMillis > intervallo){ 
       digitalWrite(pinRele, HIGH);  // relè caduto
        valSharp = 0;
        scorre = false;
        messageString = "Flusso OFF";
      }
    }
    
    // Se l'acqa scorre c'è flusso
   valAcqua = digitalRead(pinAcqua);
    if(valAcqua == LOW){
      scorre = true;
      messageString = "Flusso ON";
    }
    delay(1);
   }
   
  /*
    Since Erogazioni is READ_WRITE variable, onErogazioniChange() is
    executed every time a new value is received from IoT Cloud.
  */
  void onErogazioniChange()  { 
  
  }
  
  /*
    Since Scorre is READ_WRITE variable, onScorreChange() is
    executed every time a new value is received from IoT Cloud.
  */
  void onScorreChange()  {
    
  }

EzioGi

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.