Hola buenos días vengo desarrollando un sistema de llamada de usuario que me llama cuando tiene un problema en una maquina.
He desarrollado un software que cuando pulsas un botón envía una señal a blynk iot
y esta manda una notificación.
También registro varias señales de temperatura y activación de varios puntos de la maquina .Me gustaría saber que os parece a vosotros este código si necesitáis mas información os la facilitare el caso es que estoy inmerso en el proyecto y tengo varios dispositivos distribuidos. A veces el problema es que se queda la señal de llamada activa y no soy capaz de desactivarla con el botón de final de llamada hasta que no le doy a activar y desactivar de nuevo entonces si actúa.
Creo que uno de los de los problemas puede venir del programa.
Me gustaría que me ayudarais ya que estoy un poco agobiado con las fallas y el caso es que no se por donde tirar ya he probado a poner un reinicio cada 4h pero tampoco y creo que puede ser contraproducente.
Otro fallo a veces es que se activa la señal de llamada sola, tengo puestas unas resistencia se 4k7 en cada una de las inputs ya que no fio mucho de las resistencia de esp 32 por cierto el esp es un wroom 32u también tengo un condensador el la entrada de 3,3v a gnd de 100uf 16v y el caso es que no falla siempre solo cada tiempo y no es cíclico,
ya que no se de donde puede ser, lo que mas me urge es el problema de que no se desactiva la llamada al darle a fin de llamada y eso es problema de software a ver que veis gracias por vuestra ayuda.
un saludo espero no haberlo hecho muy tocho lo siento.
//23 luz boton
//14 aceite bajo
//35 analogica entrada temperatura 10k a ,masa y potenciometro de 100k puesto a 21k
//4 baliza roja
//12 llamada operario
//32 conteo caja
//33 final de averia
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define BLYNK_TEMPLATE_ID "cgxbhgdbhg"
#define BLYNK_DEVICE_NAME "rodadura"
#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define BLYNK_PRINT Serial
#include <Preferences.h>
//#define BLYNK_DEBUG
#define APP_DEBUG
#define USE_ESP32_DEV_MODULE
#include "BlynkEdgent.h"
#include <Arduino.h>
#include <WiFi.h>
#define OLED_RESET -1 // Reset pin
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
char ssidi[] = "gfhfsdgdfg";
char passa[] = "dghdghg";
unsigned long h;//-----------------------
int j = 0;//
int l = 0;//variables desde pantalla
int n = 0;//-----------------------------
int r = 0;//variable baliza roja para que no sea pulsado mas de uan vez
int k = 0;// asegura de que no se llame a final de averia si esta en llamada operario
int o = 0;// asegura de que no se llame a final de averia si esta en llamada operario
int q = 0;//nivel minimo de aceite variable para que no sea activado continuamente
int w ;//variable contador de cajas parcial V1
int x = 0;
int z ;//variable contador de cajas total V8
int luzboton = 23;
int aceitedepo = 14;
int cero=13;
unsigned long tiempo_guardado ;
unsigned long tiempo_guardado1 ;
int llamadaoperario;
int finalaveria;
int bl ;// BALIZA ROJA
float temp = 35; //etiqueta para lectura anal�gica PARA SENSOR DE TEMPERAURA
int y = 0;
long rssi;
Preferences preference;
BLYNK_WRITE(V6) { //SENSOR MINIMO ACEITE DEL DEPOSITO esta asociada a la aplicacion atraves de V0 y V0 es correo
int pinValue = param.asInt();//asocia pinValue a un entero en este caso es V0 que es pin 5 de wemos que D1
digitalWrite(aceitedepo, pinValue);//V0 es correo
}
//-------------------------------------boleanos para los leds de la aplicacion.
BlynkTimer timer;
WidgetLED led3(V2);//ESTE ES EL LED DE LA BALIZA ROJA ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO
boolean btnState = false;
void ledblynk()
{
boolean isPressed = (digitalRead(4) == HIGH);
if (isPressed != btnState) {
if (isPressed) {
led3.on();
r = 1;
} else {
led3.off();
r = 0;
}
btnState = isPressed;
}
}
WidgetLED led4(V3);//ESTE ES EL LED DE LLAMADA DE OPERARIO ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO
boolean btnState1 = false;
void ledblynk1()
{
boolean isPressed = (digitalRead(12) == HIGH);
if (isPressed != btnState1) {
if (isPressed) {
led4.on();
k = 1;
}
btnState1 = isPressed;
}
}
WidgetLED led5(V6);//ESTE ES EL LED DE NIVEL MINIMO DE DEPOSITO ES UN BOLEANO QUE VIGILA LA SEÑAL PARA CAMBIAR DE ESSTADO
boolean btnState2 = false;
void ledblynk2()
{
boolean isPressed = (digitalRead(14) == HIGH);
if (isPressed != btnState2) {
if (isPressed) {
led5.off();
unsigned long tiempo = millis();
tiempo_guardado = tiempo;
} else {
led5.on();
q = 0;
}
btnState2 = isPressed;
}
}
WidgetLED led6(V5);//ESTE ES EL LED de conteo de las cajas rodadas
boolean btnState3 = false;
void ledblynk3()
{
unsigned long tiempo = millis();
boolean isPressed = (digitalRead(32) == LOW);
if (isPressed != btnState3) {
if (isPressed) {
led6.off();
} else {
led6.on();
tiempo_guardado1 = tiempo;
x = 1;
delay(100);
}
btnState3 = isPressed;
}
}
void temperatura()
{
//++++++++++++++++++++++++++++++++++analogica de temperatura
int pot;
pot = analogRead(temp);
y = map(pot, 0, 4095, 0, 100); //funci�n map para escalado
Blynk.virtualWrite(V0, y);
Serial.println(y);
if ( y >= 80)
{
Serial.println("temperatura alta");
Blynk.logEvent("tempalta");
}
}
///-------------------------------llamada operario
void operario()
{
unsigned long tiempo = millis();
llamadaoperario = digitalRead(12);// 12 LLAMADA OPERARIO ES U positivo LA SEÑAL ES DE ENTRADA
if ( (llamadaoperario == HIGH) && ( k == 1) && (o == 0))
{
digitalWrite(luzboton, HIGH);
Serial.println("se ha pulsado boton de llamada");
Blynk.logEvent("llamaope");
ledblynk1();
o = 1;
}
}
//---------------funcion final de averia
void finalave()
{
finalaveria = digitalRead(33);
if ((finalaveria == HIGH) && (o == 1))
{
led4.off();
Blynk.virtualWrite(V7, 33);
Serial.println("se ha terminado la averia");
Blynk.logEvent("finalaveria");
o = 0;
digitalWrite(luzboton, LOW);
}
}
//----------------BALIZA ROJA
void baliza()
{
bl = digitalRead(4);
if ( (bl == HIGH) && (r == 0))
{
Serial.println("baliza roja encendida");
Blynk.logEvent("balizaroja");
ledblynk();
}
}
//-------------------resear contador parcial pin 13
void contadorcero()
{
int ceroo= digitalRead(cero);
if (ceroo==HIGH ) {
w = 0;
preference.remove("parcial");
Blynk.virtualWrite(V1, w);
Serial.println("parcial a cero");
}
}
void conteo()
{
//----------cuenta caja cada vez que se rueda 5 minutos seguidos para llevar preventivos en cuenta
unsigned long tiempo = millis();
int cuenta = digitalRead(32);//conteo cajas
if ((cuenta == 1) && (tiempo - tiempo_guardado1 >= 300000) && (btnState3 == LOW) && (x == 1)) {
preference.putUInt("parcial", w);
w++;
Blynk.virtualWrite(V1, w);
preference.putUInt("fijo", z);
z++;
Blynk.virtualWrite(V8, z);
x = 0;
Serial.println("caja rodada ");
}
}
//----------------------señal minimo de aceite
void aceite()
{
unsigned long tiempo = millis();
if ((tiempo - tiempo_guardado >= 10000) && (btnState2 == 1) && (q == 0)) //envia a los 10 segundos de falta de aceite
{
q = 1;
Serial.println("bajo nivel de aceite");
Blynk.logEvent("minimoaceite");
ledblynk2();
}
}
void rssimi()
{
rssi = WiFi.RSSI();
Blynk.virtualWrite(V9, rssi);
Serial.println(rssi);
}
void setup()
{
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
preference.begin("my-app", false);
w = preference.getUInt("parcial", 0);
z = preference.getUInt("fijo", 0);
WiFi.begin(ssidi, passa);
timer.setInterval(8209L, temperatura);
timer.setInterval(8783L, ledblynk);//baliza roja
timer.setInterval(7529L, aceite);
timer.setInterval(5839L, ledblynk2);//nivel aceite
timer.setInterval(6367L, contadorcero);
timer.setInterval(3037L, conteo);
timer.setInterval(2477L, ledblynk3);//conteo de cajas
timer.setInterval(2111L, pantalla);
timer.setInterval(1597L, baliza);
timer.setInterval(919L, ledblynk1);//led lamada operario cada 900ms
timer.setInterval(619L, operario);
timer.setInterval(439L, finalave);// se vigila cada 439ms
timer.setInterval(5209L, rssimi);
BlynkEdgent.begin();
pinMode(luzboton, OUTPUT);
pinMode(14, INPUT);
pinMode(12, INPUT);
pinMode(32, INPUT);
pinMode(33, INPUT);
pinMode(4, INPUT);
pinMode(cero, INPUT);
pinMode(2, OUTPUT);
}
void loop() {
BlynkEdgent.run();
timer.run();
unsigned long reinicio=millis();
if(reinicio == 3600000){
Serial.println("restaurando");
ESP.restart();
}
}
//-----------------------señales de pantalla
void pantalla()
{
h = digitalRead(14); // SENSOR DE ACEITE ES POSITIVO LA SEÑAL DE ENTRADA
j = digitalRead(12); // LLAMADA OPERARIO ES un positivo LA SEÑAL ES DE ENTRADA
l = digitalRead(4); // BALIZA ROJA ACTIVA LA SEÑAL DE ENTRADA ES positivo
n = digitalRead(33); // final averia ES positivo LA SEÑAL DE ENTRADA
//-----------------------------------DIBIJO DE CUADROS Y SEÑALES DE ENTRADA Y SALIDA
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,6);
display.println("LLAMADA OPERARIO");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,16);
display.println("NUMERO RODAJES");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,36);
display.println("BALIZA ROJA");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,46);
display.println("FINAL AVERIA");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,26);
display.println("SENSOR ACEITE");
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,56);
display.println("TEMPERATURA ACIT");
if (h == 0) {
display.setCursor(120, 26);
display.println("1");
}
if (h != 0) {
display.setCursor(120, 26);
display.println("0");
}
display.setCursor(114, 16);
display.println(w);
if (j == 0) { //llamada operario
display.setCursor(120, 6);
display.println("0");
}
if (j != 0) {
display.setCursor(120, 6);
display.println("1");
}
if (l != 0) {
display.setCursor(120, 36);
display.println("1");
}
if (l == 0) {
display.setCursor(120, 36);
display.println("0");
}
if (n != 0) {
display.setCursor(120, 46);
display.println("1");
}
if (n == 0) {
display.setCursor(120, 46);
display.println("0");
}
display.setCursor(114, 56);
display.println(y);
display.display();
}```