Problema gestione pompa

Salve a tutti,
Ho realizzato un impianto che permette di gestire l’ irrigazione in 2 modi differenti.
1° modo
Quando il pulsante pulsante bistabile è LOW la pompa si attiva in base all’ umidita del terreno.
2° modo
Quando il pulsante è high la pompa si attiva da bluetooth

Quando uso il programma singolo cioè solo la parte dell’ irrigazione funziona

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
int pompa = 13;
int UmiPin = 1;
int UmiValue;
int puls_irr = 19;
int button_irr = 0;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(puls_irr, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  button_irr = digitalRead(puls_irr);
  delay(10);
  if (button_irr == HIGH)
  {
    while (mySerial.available())
    {
      char dato = mySerial.read();
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);
            break;
          }
        case 'e':
          {
            digitalWrite(pompa, LOW);
            break;
          }
      }
    }
  }
  else {
    { UmiValue = analogRead(UmiPin);
      Serial.println(UmiValue);
      if (UmiValue > 800)
      { digitalWrite(pompa, HIGH);
      } else
      { digitalWrite(pompa, LOW);
      }
    }
  }
}

Unendo questo programma con un altro non funziona la parte relativa al bluetooth della pompa.
L’ altro programma permette di accendere dei led da pulsante e bluetooth.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
int UmiPin = 1;
int UmiValue;
int potB2 = A2;
int potB4 = A3;
int luminositaB2 = 0;
int luminositaB4 = 0;
int ledB1 = 2;
int ledB2 = 3;
int ledB3 = 4;
int ledB4 = 5;
int led_orto = 9;
int pulsB2 = 7;
int pulsB3 = 8;
int pulsB4 = 6;
int puls_irr = 19;
int puls_orto = 12;
int buttonB2 = 0;
int buttonB3 = 0;
int buttonB4 = 0;
int button_orto = 0;
int button_irr = 0;
int vecchio_valB2 = 0;
int vecchio_valB3 = 0;
int vecchio_valB4 = 0;
int vecchio_val_orto = 0;
int statoB1 = 0;
int statoB2 = 0;
int statoB3 = 0;
int statoB4 = 0;
int stato_orto = 0;
char val;
int pompa = 13;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(led_orto, OUTPUT);
  pinMode(ledB1, OUTPUT);
  pinMode(ledB2, OUTPUT);
  pinMode(ledB3, OUTPUT);
  pinMode(ledB4, OUTPUT);
  pinMode(pulsB2, INPUT);
  pinMode(pulsB3, INPUT);
  pinMode(pulsB4, INPUT);
  pinMode(puls_orto, INPUT);
  pinMode(puls_irr, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  buttonB4 = digitalRead(pulsB4);
  buttonB2 = digitalRead(pulsB2);
  buttonB3 = digitalRead(pulsB3);
  button_orto = digitalRead(puls_orto);
  button_irr = digitalRead(puls_irr);
  luminositaB2 = analogRead(potB2) / 4;
  luminositaB4 = analogRead(potB4) / 4;
  delay(10);
  if ((buttonB4 == HIGH) && (vecchio_valB4 == LOW))
  {
    statoB4 = 1 - statoB4;
  }
  vecchio_valB4 = buttonB4;
  if (statoB4 == 1) {
    analogWrite(ledB4, luminositaB4);
  }
  else {
    digitalWrite(ledB4, LOW);
  }
  if ((buttonB2 == HIGH) && (vecchio_valB2 == LOW))
  {
    statoB2 = 1 - statoB2;
  }
  vecchio_valB2 = buttonB2;
  if (statoB2 == 1) {
    analogWrite(ledB2, luminositaB2);
  }
  else {
    digitalWrite(ledB2, LOW);
  }
  if ((buttonB3 == HIGH) && (vecchio_valB3 == LOW))
  {
    statoB3 = 1 - statoB3;
  }
  vecchio_valB3 = buttonB3;
  if (statoB3 == 1) {
    digitalWrite(ledB3, HIGH);
  }
  else {
    digitalWrite(ledB3, LOW);
  }
  if ((button_orto == HIGH) && (vecchio_val_orto == LOW))
  {
    stato_orto = 1 - stato_orto;
  }
  vecchio_val_orto = button_orto;
  if (stato_orto == 1) {
    digitalWrite (led_orto, HIGH);
  }
  else {
    digitalWrite(led_orto, LOW);    //spegne il led
  }
  if (mySerial.available())
  { char dato = mySerial.read();
    switch (dato)
    { case 'A':
        statoB1 = 1;
        break;
      case 'a':
        statoB1 = 0;
        break;

      case 'B':
        statoB2 = 1;
        break;
      case 'b':
        statoB2 = 0;
        break;

      case 'C':
        statoB3 = 1;
        break;
      case 'c':
        statoB3 = 0;
        break;

      case 'D':
        statoB4 = 1;
        break;
      case 'd':
        statoB4 = 0;
        break;

      case 'F':
        stato_orto = 1;
        break;
      case 'f':
        stato_orto = 0;
        break;
    }
  }
  if (statoB1 == 1)
  { digitalWrite(ledB1, HIGH);
  }
  else
  { digitalWrite(ledB1, LOW);
  }
  if (statoB2 == 1)
  { analogWrite(ledB2, luminositaB2);
  }
  else
  { digitalWrite(ledB2, LOW);
  }
  if (statoB3 == 1)
  { digitalWrite(ledB3, HIGH);
  }
  else
  { digitalWrite(ledB3, LOW);
  }
  if (statoB4 == 1)
  { analogWrite(ledB4, luminositaB4);
  }
  else
  { digitalWrite(ledB4, LOW);
  }
  if (stato_orto == 1)
  { digitalWrite(led_orto, HIGH);
  }
  else
  { digitalWrite(led_orto, LOW);
  }
  if (button_irr == HIGH)
  {
    while (mySerial.available())
    {
      char dato = mySerial.read();
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);
            break;
          }
        case 'e':
          {
            digitalWrite(pompa, LOW);
            break;
          }
      }
    }
  }
  else {
    { UmiValue = analogRead(UmiPin);
      Serial.println(UmiValue);
      if (UmiValue > 800)
      { digitalWrite(pompa, HIGH);
      } else
      { digitalWrite(pompa, LOW);
      }
    }
  }
}

Ipotesi
Il problema puo essere che faccio la verfica della seriale due volte
1° volta

 if (mySerial.available())
  { char dato = mySerial.read();
    switch (dato)
    { case 'A':
        statoB1 = 1;
        break;
      case 'a':
        statoB1 = 0;
        break;

      case 'B':
        statoB2 = 1;
        break;
      case 'b':
        statoB2 = 0;
        break;

      case 'C':
        statoB3 = 1;
        break;
      case 'c':
        statoB3 = 0;
        break;

      case 'D':
        statoB4 = 1;
        break;
      case 'd':
        statoB4 = 0;
        break;

      case 'F':
        stato_orto = 1;
        break;
      case 'f':
        stato_orto = 0;
        break;
    }
  }

2° volta

if (button_irr == HIGH)
  {
    while (mySerial.available())
    {
      char dato = mySerial.read();
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);
            break;
          }
        case 'e':
          {
            digitalWrite(pompa, LOW);
            break;
          }
      }
    }
  }
  else {
    { UmiValue = analogRead(UmiPin);
      Serial.println(UmiValue);
      if (UmiValue > 800)
      { digitalWrite(pompa, HIGH);
      } else
      { digitalWrite(pompa, LOW);
      }
    }
  }

qualcuno può aiutarmi gentilmente. Grazie :slight_smile:

Da quel che ho visto velocemente devi creare l'enum per la macchina a stati.

enum dato {A, a, B, b, ecc...};

Scrivila sotto l'inizializzazione delle librerie e fammi sapere!

Ho provato ma non è cambiato nulla...

Al posto di MYSerial.read prova a mettere Serial.readString()

Nightwist: Assolutamente NO !!! E' corretta la mySerial.read() visto che sta leggendo un singolo carattere !

Guglielmo

Mirko00: ... inizia con il vedere cosa esattamente succede ... dopo la : "char dato = mySerial.read();", metti una "Serial.print(dato);" così, monitor seriale, vedi esattamente il carattere ricevuto ;)

Guglielmo

Mirko00: Il problema può essere che faccio la verifica della seriale due volte ...

Ovviamente devi considerare che, ogni volta che esegui una mySerial.read() [u]togli il carattere dal buffer della seriale[/u], quindi, letto una volta ... non c'è più.

Vedi tu se, nella logica del tuo programma (... che [u]NON[/u] ho esaminato), questo può essere un problema.

Guglielmo

si il problema è quello.