problemass con pulso y LCD

hola amogos estoy haciendo un tester de inyectores automotriz, basicamente lo que hace el circuito es mandar pulso pwm a 4 reles en la salida 13,12,11 y 10 el programa tiene 10 velocidades del 1 al 9 aumenta la frecuencia del pulso y en la 0 se detiene, el problema es que sin el LCD funcionaban todas las velocidades sin problema el tema es que cuando coloque el LCD al llegar a la velocidad 6 comienza a saturarse las salidas y manda las señales mal, y el resto mas rapidas ni siquiera las manda, repito sin el LCD funciona correctamente, creo que es problema de que el micro se satura ya que manda el msg por lcd junto con el pulso pero nose como solucionarlo espero una respuesta muchas gracias!! dato el pulso se controla por hc-05 bluethoot y adjunto los dos proyectos con lcd que es el que da problemas y sin lcd que es el que funciona

Inyector_Cleaner_BT_1_Prototipo_NAFTA-DIESEL.ino (7.04 KB)

Inyector_Cleaner_BT_I2C_VOID_1_Prototipo_NAFTA-DIESEL.ino (11 KB)

Bueno este es el problema que yo veo en tu código.

if (val == '1')
      velocidad1();
  if (val == '1'){
      //MENSAJE DE VELOCIDAD POR LCD (150ms)
      lcd.print("VELOCIDAD -->(1)");
      lcd.setCursor(0,1);
      lcd.print("150ms APAGAR '0'");
      lcd.setCursor(0,2);
  }

Tu código esta mal estructurado. Por qué digo esto? Pues porque cuando por BT envias el comando 1 para tomar la primer velocidad, el programa que hace?. Ejecuta velocidad1() tal como lo tenias y luego en cada ciclo muestra siempre el mismo mensaje en el LCD, y te pregunto para qué? si con hacerlo una vez es suficiente.
El mismo error ocurre con cada selección que tienes de velocidad.
Ni hablar con eso que veo que llamas nuevamente a setup(). Eso NO SE HACE y mira como lo enfatizo, no es buena práctica volver a inicializar objetos y demas cosas.

Llama a una rutina que presente los carteles que desees pero nada mas, tienes espacio de sobra antes que cometer errores que no imaginas que consecuencias tendrán.

Bien. entonces como cambiar todo?

Lo primero es que cuando le digas por BT algo, ese comando se ejecute una vez y luego se borre para que no se repita indefinidamente como lo esta haciendo ahora.
Si quieres que ejecute velocidad2 y envias 2 con hacerlo 1 vez es suficiente y luego se borra val poniendo al final de todos los if val = "" y asunto terminado.
Ahora hay que asegurarse que el programa siga ejecutando velocidad2 cuando val = "".
Asi que hay que pensar el programa con un cambio menor pero necesario.

Mas tarde te lo sugiero. Ahora debo marcharme.

Acá tienes una versión mas o menos encaminada que compila pero no se si funciona como la tuya.

//LIBRERIAS
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

//PINES
SoftwareSerial bt(4,2);
LiquidCrystal_I2C lcd(0x27,16,2); 

//VARIABLES
const byte inyector1 = 13;           //INYECTOR1
const byte inyector2 = 12;           //INYECTOR2
const byte inyector3 = 11;           //INYECTOR3
const byte inyector4 = 10;           //INYECTOR4

struct Inyectores {
  String lcd;
  unsigned long previousMillis;
  unsigned long tiempo1;
  unsigned long tiempo2;
  
};

Inyectores inyectores[] = {{"150", 150, 150},
                           {"125", 125, 125},
                           {"100", 100, 100},
                           {" 80",  80,  80},
                           {" 60",  60,  60},
                           {" 50",  50,  50},
                           {" 40",  40,  40},
                           {" 35",  35,  35},
                           {" 25",  25,  25},
                           {"  0",   0,   0}
                          };

unsigned long tiempo;
char val;           //VALOR LECTURA BLUETHOOT
byte estado = 0;


void setup(){
 bt.begin(9600);                  //ABRE PUERTO 9600
 pinMode(13, OUTPUT);             //SALIDA INYECTOR 1
 pinMode(12, OUTPUT);             //SALIDA INYECTOR 2
 pinMode(11, OUTPUT);             //SALIDA INYECTOR 3
 pinMode(10, OUTPUT);             //SALIDA INYECTOR 4

 lcd.init();             //INICIAR lcd
 lcd.backlight();             //FONDO DE lcd
 lcd.clear();             //BORRAR lcd
 lcd.setCursor(0,0);             //SETEO DE CURSOR 0,0
 lcd.print("INYECTOR CLEANER");             //MENSAJE lcd
 lcd.setCursor(0,1);             //SETEO DE CURSOR 0,1
 lcd.print("V1.0     *MARCA*");             //MENSAJE lcd
 delay(5000);             //DELAY
 lcd.clear();             //BORRAR lcd
 lcd.setCursor(0,0);             //SETEO DE CURSOR 0,0
 lcd.print("ELIJE UNA OPCION");             //MENSAJE lcd
 lcd.setCursor(0,1);             //SETEO DE CURSOR 0,1
 lcd.print("LENTO 1 RAPIDO 9");             //MENSAJE lcd
 tiempo = millis();             //unsigned long SIN SIGNO == millis()
 delay(2000);            //DELAY
}

void loop(){             //FUNCION   LOOP  
  
 if (bt.available()){             // SI BLUETHOOT ENVIA DATOS
    val = bt.read();              // LEER DATO E IGUALARLO A char (val)
    Serial.println(val);          // IMPRIMIR EN M.SERIE val
    lcd.clear();                  // BORRAR lcd
    estado = val-'0';             // paso el estado a valor numérico
    msgLCD(estado);               // presento en LCD el estado deseado de velocidad
    
 }

// aquí es donde puede colocarse otro código que necesita ser ejecutado continuamente
  switch (estado) {
    case 0: velocidad(estado);
            delay(200);
            lcd.print("Proceso Completo");
            lcd.setCursor(0,1);
            lcd.print("Inyector Cleaner");
            lcd.setCursor(1,1);
            delay(2000);
            reiniciando();
            break;   
    case 1 ... 9: velocidad(estado);
            break;
  }
}


void velocidad(byte estado) {
  if (millis() < (inyectores[estado].previousMillis + inyectores[estado].tiempo1 + inyectores[estado].tiempo2)){
      if (millis() > (inyectores[estado].previousMillis + inyectores[estado].tiempo1)){
          digitalWrite(inyector1, LOW);
          digitalWrite(inyector2, LOW);
          digitalWrite(inyector3, LOW);
          digitalWrite(inyector4, LOW);
      }
      else{
          if (estado != 0) {
              digitalWrite(inyector1, HIGH);
              digitalWrite(inyector2, HIGH);
              digitalWrite(inyector3, HIGH);
              digitalWrite(inyector4, HIGH);
          }
          else { // para el estado 0 todo en LOW
              digitalWrite(inyector1, LOW);
              digitalWrite(inyector2, LOW);
              digitalWrite(inyector3, LOW);
              digitalWrite(inyector4, LOW);
          }
      }
  }
  else {
      inyectores[estado].previousMillis = millis();
  }
}

void msgLCD(byte estado) {
  //MENSAJE DE VELOCIDAD POR LCD (150ms)
  lcd.print("VELOCIDAD -->("+String(estado)+")");
  lcd.setCursor(0,1);
  lcd.print(inyectores[estado].lcd+" APAGAR '0'");
  lcd.setCursor(0,2);

}

void reiniciando() {
  lcd.clear();                    // BORRAR lcd
  lcd.setCursor(0,0);             // SETEO DE CURSOR 0,0
  lcd.print("INYECTOR CLEANER");  // MENSAJE lcd
  lcd.setCursor(0,1);             // SETEO DE CURSOR 0,1
  lcd.print("V1.0     *MARCA*");  // MENSAJE lcd
  delay(5000);                    // DELAY
  lcd.clear();                    // BORRAR lcd
  lcd.setCursor(0,0);             // SETEO DE CURSOR 0,0
  lcd.print("ELIJE UNA OPCION");  // MENSAJE lcd
  lcd.setCursor(0,1);             // SETEO DE CURSOR 0,1
  lcd.print("LENTO 1 RAPIDO 9");  // MENSAJE lcd
  tiempo = millis();              // unsigned long SIN SIGNO == millis()
  delay(2000);                    // DELAY
}

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