Come a scuola: Correggete il mio compito

Ciao ragazzi, vi incollo l'ultimo codice che ho tirato giu, vi anticipo di seguito i problemi che ho già riscontrato io, ma nel complesso funziona più o meno tutto.

Di seguito i problemi che ho rilevato io (nel codice sono tutti contrassegnati con un divisore e titolo):

Errore 1: "Luce emergenza" - quando la corrente fa off, la luce d'emergenza si accende come programmato, ma si accende e si spegne continuamente e in modo talmente veloce che il Led non va alla massima potenza (non so come spiegarvi l'effetto in altre parole). Ne ho provate parecchie per risolvere, ma niente non capisco cosa sia! Eppure il LED funziona!

Errore 2: "ALLARME TEMP" - Se imposto MaxTemp, non rileva proprio nulla, mentre se imposto "temperature > 15" il Led rosso si accende, ma anche se la temperatura non è 15 gradi, quindi non so che rilevamento faccia per decidere di accendere il Led. Penso di aver sbagliato completamente la sintassi di programmazione per questo errore!

Errore 3: "Pulsante LUCI" - Il led funziona, ma un po a modo suo! doveva essere un collegamento semplice, reso ancor più semplice dal fatto che ci ho collegato uno di quei pulsanti a click, non confondetevi con il pulsante solito che schiacciato va il LOW e poi torna HIGH da solo, ho usato uno di quei pulsanti che schiacciato sta in LOW fino a quando non lo rischiacchi.
Doveva essere semplice, invece anche qui il Led va ad intermittenza e per i fatti suoi, a volte si accende a volte no, e quelle volte che lo fa, non si spegne piu.

Ho elencato i problemi maggiori che ho riscontrato.
Se mi aiutate a risolvere mi fate un grosso favore, perché ci sto perdendo le giornate ahah

Se trovate altri problemi, vi ringrazio in anticipo!

#include <SPI.h>


int val = 0;                  // si userà val per conservare lo stato del pin di input  
int vecchio_val = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  
  
int val2 = 0;                  // si userà val per conservare lo stato del pin di input  
int vecchio_val2 = 0;          // si userà vecchio_val per conservare lo stato del pin di input al passo precedente  
int stato2 = 0;  


int corrente = 52;
int ledPinVerde = 51;
int ledPinRosso = 53;
int ledPinGiallo = 43;
int ledPinLED = 38;


int ledState = LOW; 
long previousMillsRileva = 0; 
#define intervalRileva 500

long previousMillsLed = 0; 
#define intervalLed 300

long previousMillstemp = 0; 
#define intervaltemp 15000


int maxTemp = 15;

int buttonLucipin = 8;
int buttonResetpin = 6;
int buttonTestpin = 5;


int audio = false;

void setup()   { 

  pinMode(buttonLucipin, INPUT_PULLUP);
pinMode(buttonResetpin, INPUT_PULLUP);
  pinMode(buttonTestpin, INPUT_PULLUP);
  

  
mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  

pinMode(ledPinVerde, OUTPUT);
pinMode(ledPinRosso, OUTPUT);
pinMode(ledPinGiallo, OUTPUT);
pinMode(ledPinLED, OUTPUT);


                 /// DISPLAY
  Serial.begin(9600);

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  // init done
  
  // Show image buffer on the display hardware.
  // Since the buffer is intialized with an Adafruit splashscreen
  // internally, this will display the splashscreen.

  // Clear the buffer.
 display.display();
  delay(2000);

  // Clear the buffer.
  display.clearDisplay();




 

  // text display tests
  


//----------



}
//---------

void loop() {

allarmetemp();
pulsanti1();
pulsanti2();
 millsripetuto();
temperatura();
 luceemergenza();
}


 void millsripetuto(){
 if (millis() -  previousMillsRileva > intervalRileva )
    {
        previousMillsRileva = millis();
        controllaCorrente();
    }
    }


// TEMP & Display
void temperatura(){

  
byte temperature = 0;
  byte humidity = 0;
  byte data[40] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
    display.println("Lettura Temp. fallita");


display.setTextColor(WHITE);
display.setTextSize(3);
 display.print("ERRORE");
    
display.display();
  display.clearDisplay();

    return;
    
  }
  
  
  for (int i = 0; i < 40; i++) {
    Serial.print((int)data[i]);
    if (i > 0 && ((i + 1) % 4) == 0) {
      Serial.print(' ');

      
    }
  }

  
 display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Status Temperatura");


  

display.setTextColor(WHITE);
display.setTextSize(3);
 display.print((int)temperature); display.println(" C ");


  
   display.display();
   delay(3000);
  display.clearDisplay();
}



// CORRENTE
void controllaCorrente()
{
    byte StatoCorrente = digitalRead(corrente);
    Serial.println(StatoCorrente);
    
    if (StatoCorrente == HIGH)
    {
        digitalWrite(ledPinVerde, HIGH);
        digitalWrite(ledPinRosso, LOW);
        digitalWrite(ledPinGiallo, LOW);
       

      
        fermaAudio();
    }
    else
    {
        digitalWrite(ledPinVerde, LOW);
        digitalWrite(ledPinGiallo, LOW);
        
        avviaAudio();
        lampeggia();
        pulsanti2();
        
       
    }
}


void fermaAudio()
{
 
        myDFPlayer.disableLoopAll();
    audio = false; 
    
}

void avviaAudio()
{
if (!audio)                // se l'audio non e` gia` attivo
{
    myDFPlayer.volume(30); // Set volume value. From 0 to 30
    myDFPlayer.play(12);   // Play the first mp3
    audio = true;          // segnalo audio attivato
}
  }


void lampeggia()
{

if (millis() -  previousMillsLed > intervalLed ){
         previousMillsLed = millis(); 

if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPinRosso, ledState);
    
  }
}


// ALLARME TEMP

void allarmetemp(){
byte temperature = 0;
  
if (temperature > maxTemp){

    digitalWrite(ledPinRosso, HIGH);

}
}


// Pulsante Luci

void pulsanti1()
{

val2 = digitalRead(buttonLucipin);  // legge il valore dell'input e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((val2 == LOW) && (vecchio_val2 == HIGH)){  
    stato2 = 1 - stato2;  
                      // attesa di 15 millisecondi   
  }   
  
  vecchio_val2 = val2;            // ricordiamo il valore precedente di val  
  
    if (stato2 == 0) { 
      
      digitalWrite(ledPinLED, LOW);}
         
  else {   
    
        digitalWrite(ledPinLED, HIGH);
    
  }
  }

// Pulsante Reset
void pulsanti2(){
  byte StatoCorrente = digitalRead(corrente);
    val = digitalRead(buttonResetpin);  // legge il valore dell'input e lo conserva  
  
  // controlla se è accaduto qualcosa  
  if ((val == HIGH) && (vecchio_val == LOW)){  
    stato = 1 - stato;  
                   // attesa di 15 millisecondi  
  }   
  
  vecchio_val = val;            // ricordiamo il valore precedente di val  
  
    if (stato == 0) { 
      myDFPlayer.disableLoopAll();
    audio = false; 
      if (StatoCorrente == LOW) {
    digitalWrite(ledPinVerde, LOW);
        
        
digitalWrite(ledPinRosso, HIGH);

if (millis() -  previousMillsRileva > intervalRileva ){
         previousMillsRileva = millis(); 

if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPinGiallo, ledState);
    
  }   
  }
    } 
  else {  
        //spegne il led  
  }  
}

// Luce emergenza
void luceemergenza(){ 
byte StatoCorrente = digitalRead(corrente);
   

    if (StatoCorrente == LOW) {
digitalWrite(ledPinLED, HIGH);
}
else {
  digitalWrite(ledPinLED, LOW);
}
}

in allarmetemp dichiari la variabile temperature e gli associ 0, e poi? Controlli con if se quel zero vale più di maxtemp cosa impossibile visto che sarà sempre 0, devi leggere la temperatura dal dht11 e associarla alla variabile prima di fare l'if inoltre (ma potrei sbagliare) se leggi la temperatura dal dht11 ti dovrebbe restituire un valore con la virgola e una variabile byte non so come si comporta con un numero con virgola.

Il LED 'ledPinLED' viene comandato contemporaneamente da due funzioni diverse, quindi una scrive un valore, l'altra un altro e si danno fastidio a vicenda.

Pensavo che condividere due funzioni per un led non fosse un problema! non capisco perche quando sia spenta vada ad intermittenza veloce

miticobeppe:
Pensavo che condividere due funzioni per un led non fosse un problema! non capisco perche quando sia spenta vada ad intermittenza veloce

Senza controllar lo sketch: Una funziona accenderá il LED e l'altra lo spegne. Se vuoi usare un LED per 2 Funzioni devi gestire il caso che per una funzione deve essere spento e per l' altra acceso.

Ciao Uwe

Ciao ragazzi, grazie per le risposte...sono riuscito un po a sistemare qualche errore..

Ma ora sto notando che quando vado ad accendere // Pulsante LUCI
il led si avvia dopo 1/2 secondi e stessa cosa se lo spengo, va in off in ritardo.

E punto secondo quando è spento rimane accesso a bassa luminosità, andando in on/off ad intermittenza velocemente...e non capisco proprio da dove prenda questo comando!

Riguardo al consiglio che mi avete dato se ho capito bene, se voglio che un led condivida due funzioni devo far in modo che mentre va una funzione in HIGH, l'altra imposti il led in LOW, giusto?

se voglio che un led condivida due funzioni devo far in modo che mentre va una funzione in HIGH, l'altra imposti il led in LOW, giusto?

Un'uscita (LED o altro ) deve essere comandata da una sola funzione e basta.

Se quel LED deve segnalare cose comuni tra diverse funzioni, allora va scritta una apposita funzione con un qualche if che in base allo stato delle altre decide se in quello specifico momento va acceso o spento, e quindi lo comanda.

Quindi: una o più funzioni segnalano lo stato con delle variabili flag, e una ulteriore legge queste variabili decidendo se è il caso acceso o spento

//------------------------------------------------------
void fn1()
{
    ...
    ...
    if(...) allarme1 = true;
    else allarme1 = false;
}
//------------------------------------------------------
void fn2()
{
    ...
    ...
    if(...) allarme2 = true;
    else allarme2 = false;
}
//------------------------------------------------------
void comandaLED()
{
    if(allarme1  ||  allarme2)  ...led acceso...
    else ...led spento...
}
//------------------------------------------------------