dati seriali sballati

Ciao a tutti, mi sta capitando un problema mai visto. Sto realizzando un programma che mi identifica se un relè e azionato oppure no, con la visualizzazione sul effettivo stato del relè su cellulare.

int LuceOn = 2;
#define statoRele 3
int stato = 0;
boolean rele =false;
String readString;

void setup() {
  Serial.begin(9600);
  
  pinMode(LuceOn, OUTPUT);
  digitalWrite(LuceOn, HIGH);
  pinMode(statoRele, INPUT);


}

void loop() {
  stato = digitalRead(statoRele);
  
 if (stato == HIGH) {
    Serial.println("798798");
    delay(1000);
    }
    else {
      Serial.println("798897");
     delay(1000);
    }
  
  /*if (stato == HIGH) {
    if(rele == false){
      delay(1000);
      Serial.println("798798");
      delay(3000);
      rele = true;
      delay(3000);
  }}*/
    
  
  while (Serial.available()) {
    delay(3);  
    char c = Serial.read();
    readString += c;
}
  if (readString.length() >0) {
    Serial.println(readString);
    if (readString == "ACCENDIINGRESSO")     
    {
      digitalWrite(LuceOn, LOW);
      delay(400);
      digitalWrite(LuceOn, HIGH);
}
    if (readString == "SPEGNIINGRESSO")
    {
      digitalWrite(LuceOn, LOW);
      delay(400);
      digitalWrite(LuceOn, HIGH);
}
    
    readString="";
}
}

nella fase accendi e spegni ingresso funziona bene. ma la parte che controlla lo stato non mi da i valori esatti. se attivo il relè mi esce sul seriale il numero 798798, se disattivo mi esce 798897 ma avvolte e spesso mi esce il numero 798798. Qualcuno sa dirmi il perchè?

stato = digitalRead(statoRele);
  
 if (stato == HIGH) {
    Serial.println("798798");
    delay(1000);
    }
    else {
      Serial.println("798897");
     delay(1000);
    }

Poi vorrei fare in modo che una volta che controlla lo stato del relè non continui a mandarmi il numero di stato relè. Mi spiego meglio. se il relè è attivo mi deve uscire una sola volta sul monitor seriale il numero 798798 se il relè non è attivo mi deve uscire una sola volta l'altro numero. Grazie.

Sono senza arduino quindi non lo posso provare per sicurezza ma io lo farei così:

if (stato == HIGH) { do {Serial.println("798798");} while (stato == LOW); delay(1000); }

Così te lo scrive una volta poi controlla la condizione e visto che sarà sicuramente falsa non lo fa più! Per l altra domanda non sono sicuro

Io proverei a metterci un pulsante (o altro) al posto del rele e vedere come si comporta questo stesso sketch

attualmente sto usando questo schema, se tengo premuto inizialmente mi da un valore ma ma poi cambia poi ritorna giusto e cosi via. adesso provo la tua soluzione. solo che mi serve che se premuto mi deve un valore se non premuto l’altro valore. perchè sono dati che devo inviare via seriale “bluetooth” e devono essere giusto.

led_pulsante.png

Ho provato la tua soluzione ma non funziona, continua a dare i valori premendo o non premendo il tasto

Ma il secondo serial.print lo hai messo nello stesso modo?

Ti direi di metterlo cosí: if else con lo stato low E poi il do while uguale ma la condizione da verificare é high

Dipende da cosa hai collegato alla porta 3.

Se hai collegato, come sembra, un interruttore verso +5 V, allora devi anche mettere un resistore da 10 k che va dalla porte 3 a GND altrimenti quando l'interruttore è aperto la porta 3 è collegata al nulla e ti fornisce valori a cavolo.

Per farlo stampare solo quando varia lo stato, devi memorizzare lo stato in un'altra variabile vecchioStato e farlo stampare solo se stato != vecchioStato

P.S. visto che possono valere solo 1 - 0 puoi farle boolean

si lo schema è giusto. con una resistenza da 10 K. l'interruttore è sul positivo nel senso taglia il 5v. Il fatto che nel monitor seriale mentre scorre il numero giusto quando l'interruttore è schiacciato all'improvviso esce il numero che indica che l'interruttore è a riposo. Il fatto che questo mi comporta l'accensione della luce anche se io non lo voglio.

aggiungi un'altra variabile globale che si ricordi lo stato precedente