Ayuda con Sistema de riego automatizado Arduino+Bluetooth+MitApp

Hola muy buenas, estoy buscando ayuda para un proyecto de Arduino que usa un modulo bluetooth y se maneja con una aplicación. La cual tiene 3 modos de riego, estoy teniendo problemas a la hora de almacenar los datos o que se ejecuten los diferentes modos de riego. Necesito por favor si alguien me puede orientar o mostrarme mejores métodos para el código y/o aplicación.


Este es el código. La conexión bluetooth funciona bien, el intercambio de datos funciona. Pero cuando envío el porcentaje de humedad que necesito para el "modo x humedad" no se guarda o simplemente no funciona como esperaría.
Cuando recibo "A" desde la aplicación prende la bomba en el modo manual.
Cuando recibo "B" desde la aplicación apaga la bomba en el modo manual.
Cuando recibo "H" desde la aplicación seguido a ese carácter se envía un entero para el modo por humedad, para que trabaje cuando baje de ese porcentaje se prenda la bomba o se apague. Estoy atento a cualquier respuesta!
Desde ya muchas gracias y ofrezco disculpas si este no es el lugar correcto para hacer este tipo de consultas.

#include <SoftwareSerial.h>

 int bomba = 8; int sensorhumedad = analogRead(A0); int porcentaje; int valmodohumedadbt;
 char valorbluetoothchar=""; char corte; int entrada=1;

void setup() {
         Serial.begin(9600);
         pinMode(bomba,OUTPUT);
         pinMode(sensorhumedad,INPUT);
         pinMode(13,OUTPUT);}

void loop(){

 digitalWrite(bomba, HIGH);
 sensorhumedad = analogRead(A0);
 int porcentaje = map(sensorhumedad, 1023, 0, 1, 100);
 Serial.print(porcentaje); delay(1000);

   if(Serial.available()) 
    {
      valorbluetoothchar=Serial.read();
     do{
          digitalWrite(bomba,LOW);
          if(Serial.available()){valorbluetoothchar=Serial.read();}
          if(valorbluetoothchar=='B'){valorbluetoothchar='B';}
          sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
          Serial.print(porcentaje);
          delay(1000);
      } while(valorbluetoothchar=='A');
///

     do{
          digitalWrite(bomba,HIGH);
          if(Serial.available()){valorbluetoothchar=Serial.read();}
          if(valorbluetoothchar=='A'){valorbluetoothchar='A';}
          sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
          Serial.print(porcentaje); 
          delay(1000);
      }while (valorbluetoothchar=='B');

      if(valorbluetoothchar=='H'){valmodohumedadbt=Serial.parseInt(); entrada=11;}
      do{
  
         do{digitalWrite(bomba,LOW); sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
         Serial.print(porcentaje);Serial.println(); delay(1000);}while(valmodohumedadbt>porcentaje); 

         do{digitalWrite(bomba,HIGH);sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
         Serial.print(porcentaje); delay(1000);}while(valmodohumedadbt<porcentaje);

      }while(entrada==11);
      
     
      if(valorbluetoothchar=='C'){valorbluetoothchar="";}
     
      }
    }

Moderador:
Por favor, lee las Normas del foro
Edita tu título, usa uno que no tenga justamente lo que se considera un título inútil.
Ver en las normas punto 5.
5. Piensa un título y descriptivo
Trata de resumir tu problema con un título inteligente, útil e informativo.
Un título útil salta a la vista de las personas que podrían conocer la respuesta. Los títulos inútiles son los que deberías evitar.
Ejemplos de títulos inútiles que deberías evitar:
• ERROR EN CODIGO, AYDUA URGENTE
• Problema al programar
• Tengo un error
• Error
• Tendré problemas?
• Novato en apuros
• POR FAVOR NECESITO AYUDA RAPIDO!!!!

Lo primero es que no usas SoftwareSerial, estas usando el Serial hardware disponible en tu arduino.
No comparto la manera de leer los datos, pero parcialmente te ha funcionado.
Veré como corregirlo si no me ganan.
Cuando usas esto

Serial.print(porcentaje);

Donde esperas verlo en la App o en el monitor Serie? Por lo visto en la App.
En medio de tu código tienes cosas como

      delay(1000);

Eso hace posible que pierdas datos.
Tienes todo muy caótico. Lees algo y luego vuelves a leer.
El modo correcto es usar Serial.available() leer todos el dato y luego usando un switch case derivar a lo que se necesita y no repitir códgio como haces, vuelves a leer el adc en el canal A0 una y otra vez.

Esto por ejemplo es redundante

if (valorbluetoothchar == 'B') { 
        valorbluetoothchar = 'B'; 
      }

Si el valor recibido es B asignar B, para que? ya esta!! ya lo hiciste al leerlo.

Deberias usar el SoftwareSerial en los pines que te indico.

#include <SoftwareSerial.h>

int bomba = 8;
int sensorhumedad = analogRead(A0);
int porcentaje;
int valmodohumedadbt;
char valorbluetoothchar = "";
char corte;
int entrada = 1;
SoftwareSerial mySerial(3,4);
unsigned long tiempoSensado;

void leoSensor() {
  sensorhumedad = analogRead(A0);
  int porcentaje = map(sensorhumedad, 1023, 0, 1, 100);
  Serial.print(porcentaje);

}
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(bomba, OUTPUT);
  pinMode(sensorhumedad, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {

  if (millis() - tiempoSensado > 1000UL) {
      digitalWrite(bomba, HIGH);
      leoSensor();
      tiempoSensado = millis();
  }

  if (Serial.available()) {
    valorbluetoothchar = Serial.read();
    switch (valorbluetoothchar) {
      case 'A':
                digitalWrite(bomba, LOW);
                //Serial.println("Bomba ON");
                break;
      case 'B': digitalWrite(bomba, HIGH); 
                //Serial.println("Bomba OFF");
                break;
      
      case 'H':
                valmodohumedadbt = Serial.parseInt();
                Serial.println("\nRecibido: "+String(valmodohumedadbt)+"\n");
                entrada = 11;
                break;
      case 'C':
      default: valorbluetoothchar = "";
                break;

    }
    if (valmodohumedadbt > porcentaje)
        digitalWrite(bomba, LOW);
    else {
        digitalWrite(bomba, HIGH);
    }
  }
}

Prueba a ver. No digo que este 10 puntos pero se aproxima.

hola muy buenas noches, primero quiero agradecerte por toda esta ayuda que me estas dando, y segundo estuve probando el código que me diste y no logro que funcione, probé cambiar los pines de "mySerial" de 3,4 y de 2,3 y después invirtiendo lo cables, no conseguí que me muestre las variables del sensor de humedad en la pantalla de la aplicación. A todo esto me puse a buscar mejores métodos para que se ejecute el programa. Viendo tutoriales llegue a esto. Este codigo funciona 100% con la aplicación. Hace todo su trabajo, ya que en el modo humead cuando se desconecta el bluetooth la idea es que siga funcionando con el porcentaje de humedad que se le carga. Te agradezco un montón!
voy a robar ideas de tu código para implementarlas en el mío buenas noches!

int bomba = 8; int sensorhumedad = analogRead(A0); int porcentaje=0; int valmodohumedadbt=0;
 char valorbluetoothchar="";

void setup() {
         Serial.begin(9600);
         pinMode(bomba,OUTPUT);
         pinMode(sensorhumedad,INPUT);
         pinMode(13,OUTPUT);}

void loop(){

 digitalWrite(bomba, HIGH);
 sensorhumedad = analogRead(A0);
 int porcentaje = map(sensorhumedad, 1023, 0, 1, 100);
 Serial.print(porcentaje); delay(1000);

   if(Serial.available()) 
    {
      valorbluetoothchar=Serial.read();
      if(valorbluetoothchar=='A'){
        botonA();
      }
      if(valorbluetoothchar=='B'){
        botonB();
      }
     
      if(valorbluetoothchar=='H'){
        valmodohumedadbt=Serial.parseInt();
        modoxhumedad();
      }

      if(valorbluetoothchar=='C'){
        valorbluetoothchar="";
        valmodohumedadbt=0;
      }
}
}
    

void botonA(){
      do{
        digitalWrite(bomba,LOW);
        if(Serial.available()){valorbluetoothchar=Serial.read(); if(valorbluetoothchar=='C'){valorbluetoothchar="";}
        if(valorbluetoothchar=='B'){valorbluetoothchar='B';}}
        
        sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
        Serial.print(porcentaje);
        delay(1000);
      }while(valorbluetoothchar=='A');
}

void botonB(){
      do{
        digitalWrite(bomba,HIGH);
        if(Serial.available()){valorbluetoothchar=Serial.read(); if(valorbluetoothchar=='C'){valorbluetoothchar="";}
        if(valorbluetoothchar=='A'){valorbluetoothchar='A';}}
        sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
        Serial.print(porcentaje); 
        delay(1000);
      }while (valorbluetoothchar=='B');
}

void modoxhumedad(){
        do{
          sensorhumedad= analogRead(A0); int porcentaje = map(sensorhumedad, 1023,0,1,100);
          Serial.print(porcentaje); delay(1000);

          if(valmodohumedadbt>porcentaje){digitalWrite(bomba,LOW);}
          else{digitalWrite(bomba,HIGH);}
          if(Serial.available()){valorbluetoothchar=Serial.read(); if(valorbluetoothchar=='C'){ 
          digitalWrite(bomba,HIGH); valorbluetoothchar=""; valmodohumedadbt=0;}}
 
        }while (valorbluetoothchar=='H');
}

Moderador
Tienes una primer advertencia a las 3 sanción.
Lee de nuevo mi posteo #2

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.