Hoy les traigo un código que tengo hace bastante (lamentablemente no tengo fotos del sensor y demás), funciona con un módulo detector de gas y humo (de la serie mq-xxx), el módulo gsm800 y un arduino nano. El código es sencillo, cuando se lee que la cantidad de gas en el aire supera cierto valor, el micro activa una alarma visual y sonora, además de desconectar un pin (esto es porque la idea era usarlo con una electroválvula controlada con un relé, por lo que el pin que se desconecta debería ir al relé) y luego de un tiempo (10 segundos) si se sigue detectando gas o humo se envía un mensaje de texto al número programado.
Este equipo está diseñado para bajos caudales de gas (de humo no porque no existe riesgo de que explote e inutilice el equipo), por ejemplo una hornalla o en el caso más extremos una estufa.
Obviamente este equipo no está destinado a armarse porque tiene muchísimas fallas, desde un principio no tiene ninguna redundancia, por lo que si falla algo no hay una segunda instancia verificando.
A continuación les dejo el código:
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX long tiempo; int pin_led_verm = 3; //led indicador de electrovalvula de gas conectada int pin_buzzer = 2; //sonido y señalización luminosa indicadora de alarma int pin_d0 = 4; int pin_a0 = A7; int nivel_sensor = 100; void setup () { pinMode(pin_d0, INPUT); pinMode(pin_a0, INPUT); pinMode(pin_led_verm, OUTPUT); pinMode(pin_buzzer, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, HIGH); Serial.begin(9600); //------------------------------------------------------// mySerial.begin(9600); delay(20000); Serial.println("encendido"); comando ("at"); delay(20000); comando ("ATI+CMEE=2"); //pone el modo de los errores en texto comando ("at"); // comando ("ati"); //obtiene nombre del módulo y versión comando ("at+ccid"); //obtiene el número de la tarjeta sim comando ("at+cbc"); //obtiene el estado de la batería comando ("at+csq"); //obtiene la fuerza de la señal comando ("at+cops?"); //obtiene la conección de la red mySerial.print("AT+CMGF=1\r"); //modo texto Serial.println("fin del informe"); } void loop () { int valor_digital = digitalRead(pin_d0); int valor_analogico = analogRead(pin_a0); Serial.print("valor digital: "); Serial.print(valor_digital); Serial.print(" valor analogico: "); Serial.println(valor_analogico); if(valor_analogico > nivel_sensor) { digitalWrite(pin_led_verm, LOW); //corta electroválvula de gas digitalWrite(pin_buzzer, HIGH); //suena alarma visual y audible /* * verifico que haya durante 10 segundos gas antes de enviar * el mensaje. */ for(int i = 0; i < 11; i++) { digitalWrite(13, LOW); if(i == 10 && analogRead(pin_a0) > nivel_sensor) { digitalWrite(13, HIGH); Serial.print("mandando mensaje"); mensaje (); Serial.print("mensaje enviado"); } delay(800); } } else { digitalWrite(pin_led_verm, HIGH); //válvula conectada digitalWrite(pin_buzzer, LOW); //Sonido y led silenciado } } void mensaje () { /* * si se quieren agregar varios números hay que * hacerlo en la variable numero y separarlos por * comas. */ char* numero[]={"54911*******"}; Serial.println("envio de sms"); delay(200); for(int i = 0; i < sizeof(numero); i++) { Serial.println(i); delay(200); mySerial.print ("AT+CMGS=\"+"); mySerial.print (numero[i]); mySerial.println ("\""); delay(200); mySerial.write('\r'); delay(200); mySerial.print("alarma de gas o humo"); delay(300); mySerial.write(0x1A); delay(7000); } Serial.println("fin del informe"); } void comando (char com[40]) { mySerial.write(com); mySerial.write('\r'); delay(200); while (mySerial.available()) { Serial.write(mySerial.read()); } }