Soy novato en el tema de la programación del Arduino, he realizado montajes con el, pero siempre modificando algún programa existente en la red.
En mi domicilio me ha pasado que, sin motivo aparente, ha saltado el diferencial que alimenta la nevera con el problema que genera.
Por ello he diseñado un programa que vigila los dos diferenciales de la instalación que funciona , pero aparentemente cuando hay un micro corte o un espurio señaliza correctamente la falta de tensión, pero no así su recuperación. Os mando el sketch por si podéis ayudarme.
//Módulo de telefonia movil SIM800L
#include <SoftwareSerial.h> //libreria del SIM900
//Configuracion del SIM900
SoftwareSerial SIM900(7, 8);
const int Dif1 = 2; // objeto(1), representa el estado de un objeto tangible, como el estado de una puerta por ejemplo.
const int Dif2 = 4;
//Pin 10 Información estado nevera Dif1
//Pin 11 Informacion estado red Dif2
int enviar = 0;
String Mensaje;
unsigned long retardo = 300000; //retardo de 3 segundosd
unsigned long timing ; // Varaible para almacenar el punto de referencia en Void setup
boolean SMS_Open1 = true;
boolean SMS_Closed1 = true;
boolean SMS_Open2 = true;
boolean SMS_Closed2 = true;
void setup() {
Serial.begin(19200);
SIM900.begin(9600); //Velocidad de comunicacion con el modulo SIM800L
pinMode(Dif1, INPUT_PULLUP);
pinMode(Dif2, INPUT_PULLUP);
pinMode(10, OUTPUT); //Sensor(1) representacion de la salida de un sensor monitoreando el objeto(1)
pinMode(12, OUTPUT); //Sensor(2) representacion de la salida de un sensor monitoreando el objeto(2)
SIM900.println("AT+CMGF=1\r"); // Configurar el módulo en modo de texto
delay(500); //Tiempo de espera para que el modulo se conecte a una red
SIM900.println("AT+CNMI=2,2,0,0,0\r"); //Configuracion de la forma como recibir mensajes
Mensaje.reserve(100);
}
void loop() {
// Cuando el sensor esta indicando que el diferencial1 Nevera esta CERRADO:
timing = millis(); //Inicializa timing
if ((digitalRead(Dif1) == HIGH) && (digitalRead(10) == LOW))
{
if (millis() - timing >= retardo); { //ajustar valor de retardo
timing = millis();
}
digitalWrite(10, HIGH);
SMSDif1_con_tension(); //Se envía la notificacion del evento
SMS_Closed1 = true;
//delay(300);
}
//Cuando el sensor esta indicando que el diferencial1 Nevera esta ABIERTO:
else if ((digitalRead(Dif1) == LOW) && (digitalRead(10) == HIGH))
{
timing = millis();
if (millis() - timing >= retardo); { //ajustar valor de retardo
timing = millis();
}
digitalWrite(10, LOW);
SMSDif1_sin_tension (); //Se envía la notificacion del evento
SMS_Open1 = true;
//delay (300);
}
// Cuando el sensor esta indicando que el diferencial1 General esta CERRADO:
timing = millis();
if ((digitalRead(Dif2) == HIGH) && (digitalRead(12) == LOW))
{
if (millis() - timing >= retardo); { //ajustar valor de retardo
timing = millis();
}
digitalWrite(12, HIGH);
SMSDif2_con_tension(); //Se envía la notificacion del evento
SMS_Closed2 = true;
//delay(300);
}
//Cuando el sensor esta indicando que el diferencial1 General esta ABIERTO:
else if ((digitalRead(Dif2) == LOW) && (digitalRead(12) == HIGH))
{
timing = millis();
if (millis() - timing >= retardo); { //ajustar valor de retardo
timing = millis();
}
digitalWrite(12, LOW);
SMSDif2_sin_tension (); //Se envía la notificacion del evento
SMS_Open2 = true;
//delay (300);
}
}
//Lo que se escriba en el monitor serie, se trasladará al modulo SIM800L
void serialEvent() {
if (Serial.available())
{
String text = Serial.readString();
SIM900.println(text);
}
}
//Rutina de servicio a la interrupcion para el monitor serie 1
void serialEvent1(){
if (SIM900.available() > 0 )
{
Mensaje = SIM900.readStringUntil("\n");
Serial.println("Nuevo Mensaje:");
SIM900.println(Mensaje);
}
}
//Funcion de alerta sobre Diferencial Nevera con tension por SMS
void SMSDif1_con_tension()
{
if (SMS_Open1 == true)
{
envio_SMS("ZONA NEVERA NORMAL");
SMS_Open1 = false;
}
}
//Funcion de notificacion de Diferencial Nevera sin tension SMS
void SMSDif1_sin_tension()
{
if (SMS_Closed1 == true)
{
envio_SMS("ZONA NEVERA SIN TENSION");
SMS_Closed1 = false;
}
}
//Funcion de alerta sobre Diferencial Red con tension por SMS
void SMSDif2_con_tension()
{
if (SMS_Open2 == true)
{
envio_SMS("ZONA NEVERA Y RED NORMAL");
SMS_Open2 = false;
}
}
//Funcion de notificacion de Diferencial Red sin tension SMS
void SMSDif2_sin_tension()
{
if (SMS_Closed2 == true)
{
envio_SMS("ZONA NEVERA CON TENSION");
SMS_Closed2 = false;
}
}
void envio_SMS(const char *str) {
SIM900.println("AT+CMGF=1");
delay(200);
SIM900.println("AT+CMGS=\"+34609778883\"");
delay(200);
SIM900.print(str);
delay(200);
Serial.println(str);
delay(200);
SIM900.print((char)26);
delay(200);
SIM900.println("");
delay(200);
}
Otra cosa que me gustaría implementar es la posibilidad de interrogar al Arduino para que me refrescara la información, lo he intentado añadiendo alguna cosa para probar pero no consigo resultados.
Sorry I cannot follow what you want. The translation does not make any sense. This is the English area of the forum. Posting in the area where your language is spoken will help.
#include <SoftwareSerial.h>
SoftwareSerial SIM900 (7,8);
const int Dif1 = 2; // Pin donde está conectado el diferencial 1
const int Dif2 = 4; // Pin donde esta conectado el diferencial 2
int estadoDif1; // Estado actual del diferencial 1
int estadoDif2; // Estado actual del diferencial 2
int ultimoEstadoDif1; // Estado anterior del diferencial 1
int ultimoEstadoDif2; // Estado anterior del diferencial 2
unsigned long ultimoTiempoDebounce1 = 0; // Tiempo en el que ocurrió el último cambio
unsigned long retardoDebounce1 = 3000; // Retardo en milisegundos
unsigned long ultimoTiempoDebounce2 = 0; // Tiempo en el que ocurrió el último cambio
unsigned long retardoDebounce2 = 3000; // Retardo en milisegundos
int enviar = 0;
String Mensaje;
boolean SMS_Open1 = true;
boolean SMS_Closed1 = true;
boolean SMS_Open2 = true;
boolean SMS_Closed2 = true;
void setup() {
pinMode(2, INPUT_PULLUP); // Configurar el pin como entrada con resistencia pull-up interna
pinMode(4, INPUT_PULLUP); // Configurar el pin como entrada con resistencia pull-up interna
pinMode (10,OUTPUT); //Estado diferencial 1
pinMode (12,OUTPUT); //Estado diferencial
// pinMode (13,OUTPUT); // Señalizacion recepcion SMS
Serial.begin(19200); //velocifdad comunicacion con monitor serial
SIM900.begin(9600); //velicidad comunicacion SIM
SIM900.println ("AT+CMGF=1\r"); //configurar SIM modo texto
delay (500); //tiempo espera acomodar SIM
SIM900.println ("AT+CNMI=2,2,0,0,0\r"); //Configura SIM para mostrar SMS por puerto serie
Mensaje.reserve(100);
}
void loop() {
loopDif1();
loopDif2();
}
// Leer el estado actual del diferencial 1
void loopDif1() {
int lectura1 = digitalRead(Dif1);
// Detectar si el estado ha cambiado
if (lectura1 != ultimoEstadoDif1) {
ultimoTiempoDebounce1 = millis(); // Reiniciar el temporizador
}
// Comprobar si ha pasado el tiempo de retardo
if ((millis() - ultimoTiempoDebounce1) > retardoDebounce1) {
// El botón se ha estabilizado, registrar el cambio
if (lectura1 != estadoDif1) {
estadoDif1 = lectura1;
// Si el diferencial está cerrado (estado bajo, debido a INPUT_PULLUP)
if (estadoDif1 == LOW) {
digitalWrite (10, HIGH);
SMSDif1_con_tension(); //Se envia notificación del evento
SMS_Closed1 = true;
}
else if (estadoDif1 == HIGH) {
digitalWrite (10, LOW);
SMSDif1_sin_tension(); //Se envia notificación del evento
SMS_Open1 = true;
}
}
}
//Guardar la lectura actual para la siguiente iteración
ultimoEstadoDif1 = lectura1;
}
// Leer el estado actual del diferencial
void loopDif2() {
int lectura2 = digitalRead(Dif2);
// Detectar si el estado ha cambiado
if (lectura2 != ultimoEstadoDif2) {
ultimoTiempoDebounce2 = millis(); // Reiniciar el temporizador
}
// Comprobar si ha pasado el tiempo de retardo
if ((millis() - ultimoTiempoDebounce2) > retardoDebounce2) {
// El botón se ha estabilizado, registrar el cambio
if (lectura2 != estadoDif2) {
estadoDif2 = lectura2;
// Si el diferencial está cerrado (estado bajo, debido a INPUT_PULLUP)
if (estadoDif2 == LOW) {
digitalWrite (12, HIGH);
SMSDif2_con_tension(); //Se envia notificación del evento
SMS_Closed2 = true;
}
else if (estadoDif2 == HIGH) {
digitalWrite (12, LOW);
SMSDif2_sin_tension(); //Se envia notificación del evento
SMS_Open2 = true;
}
}
}
// Guardar la lectura actual para la siguiente iteración
ultimoEstadoDif2 = lectura2;
}
//Lo que se escriba en el monitor serie se traasladará al módulo SIM900
void serialEvent(){
if (Serial.available())
{
String text = Serial.readString();
SIM900.println(text);
}
}
//Rutina de servicio a la interrupción para el monitor serie
void serialEvent1(){
if (SIM900.available() > 0)
{
Mensaje = SIM900.readStringUntil ("\n");
Serial.println ("Nuevo Mensaje:");
SIM900.println(Mensaje);
}
}
//Funcion de alerta sobre Diferencial Nevera con tension por SMS
void SMSDif1_con_tension(){
if (SMS_Open1 == true)
{
envio_SMS("ZONA NEVERA NORMAL");
SMS_Open1 = false;
}
}
//Funcion de notificacion de Diferencial Nevera sin tension SMS
void SMSDif1_sin_tension(){
if (SMS_Closed1 == true)
{
envio_SMS("ZONA NEVERA SIN TENSION");
SMS_Closed1 = false;
}
}
//Funcion de alerta sobre Diferencial Red con tension por SMS
void SMSDif2_con_tension(){
if (SMS_Open2 == true)
{
envio_SMS("RED NORMAL");
SMS_Open2 = false;
}
}
//Funcion de notificacion de Diferencial Red sin tension SMS
void SMSDif2_sin_tension(){
if (SMS_Closed2 == true)
{
envio_SMS("RED SIN TENSION");
SMS_Closed2 = false;
}
}
void envio_SMS(const char *str) {
//SIM900.println("AT+CMGF=1/r");
//delay(200);
SIM900.println("AT+CMGS="+34609778883"");
delay(200);
SIM900.print(str);
delay(200);
Serial.println(str);
delay(200);
SIM900.print((char)26);
delay(200);
SIM900.println("");
delay(200);
}
void preguntar() {
if (SIM900.available() >0) {
String mensaje = SIM900.readString(); //Lee los datos del modulo SIM
Serial.println(mensaje);
if (mensaje.indexOf ("E") =0 && 10 = HIGH) { //Busca el codigo "E" en el mensaje
// digitalWrite (13,HIGH);
SIM900.println (" NEVERA CON TENSION");
}else {
// digitalWrite(13,LOW);
SIM900.println ("NEVERA SIN TENSIONo");
SIM900.println("AT+CMGS="+xxxxxxxxx""); // Reemplaza con el número de teléfono
SIM900.write(26);
}
}
no tiene sentido, intenta asignar un valor a un literal (10 es 10 y no se puede cambiar).
Lo correcto es
if (mensaje.indexOf ("E") == 0 && digitalRead(10) == HIGH) {
Si embargo sería más apropiado usar el estado del diferencial en lugar del de su LED testigo.
if (mensaje.indexOf ("E") == 0 && estadoDif1 == LOW) {
Por otro lado
// Si el diferencial está cerrado (estado bajo, debido a INPUT_PULLUP)
if (estadoDif1 == LOW) {
digitalWrite (10, HIGH);
SMSDif1_con_tension(); //Se envia notificación del evento
SMS_Closed1 = true;
}
else if (estadoDif1 == HIGH) {
digitalWrite (10, LOW);
SMSDif1_sin_tension(); //Se envia notificación del evento
SMS_Open1 = true;
}
se puede simplificar a
// Si el diferencial está cerrado (estado bajo, debido a INPUT_PULLUP)
if (estadoDif1 == LOW) {
digitalWrite (10, HIGH);
SMSDif1_con_tension(); //Se envia notificación del evento
SMS_Closed1 = true;
} else {
digitalWrite (10, LOW);
SMSDif1_sin_tension(); //Se envia notificación del evento
SMS_Open1 = true;
}
Ya que estadoDif1 solo puede tener dos valores, HIGH y LOW y si no es LOW solo puede ser HIGH, no hay otros posibles valores que justifiquen una sentencia else if().
Corregido el primer error de sintaxis, y simplificado el sketch según tu consejo. Ahora si que me compila pero continúa sin responder a mi pregunta. Continuaré investigando el porqué.