Problema con l'includere comandi tramite app android

ciao ragazzi sto costruendo un sistema di controllo temperature e relè per dei terrai,
ho introdotto che la luce si accenda alle 7&30 ed si spenga alle 20&30 l'app mi serve per controllarlo da remoto fuori casa; il fattore che quando do il comando di accensione/spegnimento lui fa l'azione ma poi cambia stato, vi posto lo skech cosi mi aiutate sto uscendo pazzo.

//    P R O G E T T O  T E R R A I O
//           di IVAN 

// LIBRERIE PER OROLOGIO
#include <Time.h>
#include "RTClib.h"

RTC_DS1307 rtc;



// LIBRERIE PER DISPLAY e SENSORE Temperatura e Umidita
#include <SoftwareSerial.h>  // includo la libreria per la comunicazione seriale

SoftwareSerial mySerial(10, 11);  // imposto i pin per la comunicazione seriale
// Collegare i pin nel seguente modo: RX=>11 TX=>10

#include <DHT.h>
#include <LiquidCrystal_I2C.h>

// i pin delle 2 luci
#define Luce_Terraio 13   // pin 13
#define Luce_Terraio2 12  // pin 12

// i pin dei 2 sensori
DHT dht1(2, DHT11);  // pin 2
DHT dht2(3, DHT11);  // pin 3

// tipologia display
LiquidCrystal_I2C lcd(0x27, 16, 2);



void setup() {

  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);



  mySerial.begin(9600);  // setto la comunicazione
  Serial.println("Ivan Scordato Creation");
  delay(10000);

  Serial.begin(57600);

  // controllo se il Sensore è collegato
  if (!rtc.begin()) {
    Serial.println("Sensore RTC non collegato");
  }

  dht1.begin();
  dht2.begin();

  lcd.init();
  lcd.backlight();
  pinMode(Luce_Terraio, OUTPUT);
  pinMode(Luce_Terraio2, OUTPUT);

  // imposta che all'accensione le due luci del terraio sono spente
  digitalWrite(Luce_Terraio, HIGH);
  digitalWrite(Luce_Terraio2, HIGH);
}

void loop() {

  {
    while (mySerial.available()) {
      char dato = mySerial.read();  // "dato" è il valore che viene ricevuto dalla seriale
      switch (dato) {
        case 'A':  // Se ricevo la lettera A,
          {
            digitalWrite(12, HIGH);  // eccito il relè collegato al pin12
            mySerial.println("Relè 1 ON");
            break;
          }
        case 'a':  // Se ricevo la lettera a
          {
            digitalWrite(12, LOW);  // Spenfo il relè
            mySerial.println("Relè 1 OFF");
            break;
          }
          // E così anche di seguito...
        case 'B':
          {
            digitalWrite(13, HIGH);
            mySerial.println("Relè 2 ON");
            break;
          }
        case 'b':
          {
            digitalWrite(13, LOW);
            mySerial.println("Relè 2 OFF");
            break;
          }
      }
    }
  }




  DateTime now = rtc.now();

  // controllo se orologio funziona
  Serial.print("Data : ");
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.println(now.day(), DEC);

  Serial.print("Ora : ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  Serial.println();

  delay(10000);

  int t1 = dht1.readTemperature();
  int h1 = dht1.readHumidity();

  int t2 = dht2.readTemperature();
  int h2 = dht2.readHumidity();

  // imposto il display per la visualizzazione della temperatura e umidità
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("T1:" + String(t1) + char(0xDF));
  lcd.setCursor(8, 0);
  lcd.print("H1:" + String(h1) + "%");

  lcd.setCursor(0, 1);
  lcd.print("T2:" + String(t2) + char(0xDF));
  lcd.setCursor(8, 1);
  lcd.print("H2:" + String(h2) + "%");


  // se non arriva niente da tastiera ....
  // inizia la procedura automatica

  if (Serial.available() == 0) {

    // imposto condizione temperatura 40 gradi
    if (t1 > 40) {
      digitalWrite(Luce_Terraio, HIGH);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("T1 >40 gradi");

      lcd.setCursor(0, 1);
      lcd.print("T2:" + String(t2) + char(0xDF));
      lcd.setCursor(8, 1);
      lcd.print("H2:" + String(h2) + "%");
    }


    // imposto accensione espegnimento luci alle 7.30 e alle 20.00
    if (now.minute() >= 30 && now.hour() >= 7) {
      digitalWrite(Luce_Terraio, LOW);
      digitalWrite(Luce_Terraio2, LOW);
    }

    if (now.minute() >= 30 && now.hour() >= 20) {
      digitalWrite(Luce_Terraio, HIGH);
      digitalWrite(Luce_Terraio2, HIGH);
    }
  }

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

  /* se arriva qualche comando da tastiera ....
 con il tasto A accendo luce terraio 1 
 con il tasto S spengo la luce terraio 1 
 il comando viene attivato dopo qualche secondo perchè prima 
 fa tutto il loop del sistema con i sensori ...
*/

  else {
    char comandoricevuto = Serial.read();

    if (comandoricevuto == 'A') {
      digitalWrite(Luce_Terraio, HIGH);
      Serial.println("Luce_Terraio Acceso");
    }

    if (comandoricevuto == 'S') {
      digitalWrite(Luce_Terraio, LOW);
      Serial.println("Luce_Terraio spento");
    }
  }  // fine del comando seriale
}

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, il codice, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE) e di correggere poi di conseguenza il tuo post .

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione e sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

salve e grazie per le delucidazioni cosi va bene?

Si, certo, molto più leggibile, grazie :slight_smile:

Guglielmo

E' normale che accada perché una volta che hai eseguito l'istruzione a seguito del comando da remoto "riprende il controllo" il pezzo di codice che controlla l'orario ed agisce di conseguenza.

Devi fare in modo che i comandi ricevuti da remoto siano prioritari ed inibiscano il normale funzionamento con il timer ad esempio impostando a true una variabile boolean di "ovverride" che escluderà il blocco con la verifica dell'ora.

Detta così sembra quasi semplice riuscireste a darmi un aiuto con il codice ? Sempre se non è un problema per voi, grazie mille :star_struck:

bool override = false;
   .....
   .....
   if (now.minute() >= 30 && now.hour() >= 7 && override == false) {
      digitalWrite(Luce_Terraio, LOW);
      digitalWrite(Luce_Terraio2, LOW);
    }
   .....
   .....
   if (comandoricevuto == 'A') {
      digitalWrite(Luce_Terraio, HIGH);
      Serial.println("Luce_Terraio Acceso");
      override = true;
    }

    if (comandoricevuto == 'S') {
      digitalWrite(Luce_Terraio, LOW);
      Serial.println("Luce_Terraio spento");
      override = false;
    }
    .....
    .....

Oggi appena arrivò a casa lo provo grazie mille, ma tu che sei più esperto di me molto sicura come cosa hai visto il codice ti sembra giusto compilato così o ci sono errori? Grazie di cuore

ciao un quesito questo comando va in loop o in setup? grazie