programma bluetooth e umidita

salve,
sto realizzando un programma per controllare l, irrigazione sia da telefono attraverso un modulo bluettoth sia in automatico con sensore di umidita.
quando il pulsante è su stato 1 controllo da telefono
se 0 controllo automatico.

ecco il programma che pero nn funziona

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
int pompa = 13;
int UmiditaSensore = 1;
int valoreumidita;
int b = 0;
int oldval = 0;
int stato = 0;
int pulsante = 2;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(pulsante, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  b = digitalRead(pulsante);
  delay(10);
  while (mySerial.available())
  {
    char dato = mySerial.read();

    if ((b == HIGH) && (oldval == LOW))
    {
      stato = 1 - stato;
    }
    oldval = b;
    if (stato == 1) {
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);

            break;

          }
        case 'e':
          {
            digitalWrite(pompa, LOW);

            break;
          }
      }
    }
    else {
      if (stato == 0)
      { valoreumidita = analogRead(UmiditaSensore);
        Serial.println(valoreumidita);
        if (valoreumidita < 300)
        { digitalWrite(pompa, HIGH);
        } else
        { digitalWrite(pompa, LOW);
        }
      }
    }
  }
}

di preciso cosa non funziona?

così al volo mi sembra che:

  • manchi il pinMode su UmiditaSensore
  • la parte che riguarda il sensore è dentro il while (mySerial.available()) e quindi viene eseguita solo se ci sono dati sulla seriale

ps: indenta meglio il codice, risulta più semplice capirlo.

fratt:

  • manchi il pinMode su UmiditaSensore

UmiditaSensore indica un pin analogico che viene usato con una analogRead() e quindi NON richiede alcun pinMode().

@Mirko00: Se usassi la funzione Tools -> Autoformat otterresti un codice molto più leggibile dato che ... quello che hai messo "nun se po' vedé" !

Guglielmo

gpb01:
UmiditaSensore indica un pin analogico che viene usato con una analogRead() e quindi NON richiede alcun pinMode().

questa non la sapevo... imparata una cosa nuova...

Mirko00:
salve,

ecco il programma che pero nn funziona

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);
int pompa = 13;
int UmiditaSensore = 1;
int valoreumidita;
int b = 0;
int oldval = 0;
int stato = 0;
int pulsante = 2;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(pulsante, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  b = digitalRead(pulsante);
  delay(10);
  while (mySerial.available())
  {
    char dato = mySerial.read();

if ((b == HIGH) && (oldval == LOW))
    {
      stato = 1 - stato;
    }
    oldval = b;
    if (stato == 1) {
      switch (dato) {
        case ‘E’:
          {
            digitalWrite(pompa, HIGH);

break;

}
        case ‘e’:
          {
            digitalWrite(pompa, LOW);

break;
          }
      }
    }
    else {
      if (stato == 0)
      { valoreumidita = analogRead(UmiditaSensore);
        Serial.println(valoreumidita);
        if (valoreumidita < 300)
        { digitalWrite(pompa, HIGH);
        } else
        { digitalWrite(pompa, LOW);
        }
      }
    }
  }
}

:stuck_out_tongue:

Ho modificato il programma e funziona quasi come vorrei.
L’ unico problema da risolvere è:
quando il pulsante è su stato 0 e la pompa è attiva (perchè la condizione del sensore di umidita è verificata) mettendo il pulsante su stato 1 non si spegne.
Devo aggiungere una variabile booleana ?

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
int pompa = 13;
int UmiditaSensore = 1;
int valoreumidita;
int b = 0;
int oldval = 0;
int stato = 0;
int pulsante = 19;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(pulsante, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  b = digitalRead(pulsante);
  delay(10);


  if ((b == HIGH) && (oldval == LOW))
  {
    stato = 1 - stato;
  }
  oldval = b;
  if (stato == 1) {
    while (mySerial.available())
    {
      char dato = mySerial.read();
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);
            break;
          }
        case 'e':
          {
            digitalWrite(pompa, LOW);
            break;
          }
      }
    }
  }
  else {
    if (stato == 0)
    { valoreumidita = analogRead(UmiditaSensore);
      Serial.println(valoreumidita);
      if (valoreumidita < 700)
      { digitalWrite(pompa, HIGH);
      } else
      { digitalWrite(pompa, LOW);
      }
    }
  }
}

ma se metti il pulsante a 1 la pompa si ferma se mandi 'e' sulla seriale? perché comunque lo sketch aspetta la 'e' prima di spegnere...

poi, nell'else non serve che metti "if (stato == 0)" perché se arrivi all'else vuol dire che stato è 0 quindi quella condizione è sempre vera.

si si spegne quando riceve la 'e'.

quindi?
va bene così o vorresti che si spegnesse comunque?

vorrei che si spegnesse quando premo il pulsante ( stato 1)

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);
int pompa = 13;
int UmiditaSensore = 1;
int valoreumidita;
int b = 0;
int oldval = 0;
int stato = 0;
int pulsante = 2;
void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(pulsante, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}
void loop()
{
  b = digitalRead(pulsante);
  delay(10);
  while (mySerial.available())
  {
    char dato = mySerial.read();

    if ((b == HIGH) && (oldval == LOW))
    {
      stato = 1 - stato;
    }
    oldval = b;
    if (stato == 1) {
      switch (dato) {
        case 'E':
          {
            digitalWrite(pompa, HIGH);

            break;

          }
        case 'e':
          {
            digitalWrite(pompa, LOW);

            break;
          }
      }
    }
    else {
      
      { valoreumidita = analogRead(UmiditaSensore);
        Serial.println(valoreumidita);
        if (valoreumidita < 300)
        { digitalWrite(pompa, HIGH);
        } else
        { digitalWrite(pompa, LOW);
        }
      }
    }
  }
}

soluzioni?

ma sei tornato alla versione con la parte del sensore dentro il while (mySerial.available())?

prova così…

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);

int pompa = 13;
int UmiditaSensore = 1;
int valoreumidita;
int b = 0;
int oldval = 0;
int stato = 0;
int pulsante = 19;

void setup()
{
  pinMode(pompa, OUTPUT);
  pinMode(pulsante, INPUT);
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(1000);
}

void loop()
{
  b = digitalRead(pulsante);
  delay(10);

  if ((b == HIGH) && (oldval == LOW))
  {
    stato = 1 - stato;
  }
  oldval = b;

  if (stato == 1) {
    digitalWrite(pompa, LOW);
    
    if (mySerial.available())
    {
      char dato = mySerial.read();
      if (dato == 'E') {
        digitalWrite(pompa, HIGH);
      }
    }
  }
  else {
    valoreumidita = analogRead(UmiditaSensore);
    Serial.println(valoreumidita);
    if (valoreumidita < 700)
    { digitalWrite(pompa, HIGH);
    } else
    { digitalWrite(pompa, LOW);
    }
  }
}

ho cambiato qualcosa, vedi se funziona.