Envio de SMS con SIM900 y arduino UNO

Todo lo relacionado con el software de Arduino
Responder
YUXER
Mensajes: 3
Registrado: Mié Abr 24, 2019 12:28 am

Envio de SMS con SIM900 y arduino UNO

Mensaje por YUXER » Mié Abr 24, 2019 12:40 am

Buenas tardes.

Estoy haciendo mi primer proyecto y me encontré con un problema que no he podido solucionar. Se muy poco de programación y quisiera un poco de ayuda.

El problema es que tengo algunos sensores y relays conectados al UNO y quisiera que con el SMS "STATE" me envíe el estado actual de dicho relay, si está ON u OFF.

También tengo un transductor de presión que quisiera que en caso de leer una valor determinado me envie un SMS. Ejemplo: si outputValue <= 286 que envíe un SMS diciendo alerta presión baja, actualmente envía dicho SMS pero si subo la presión y la vuelvo a bajar a <=286 ya no envía mas SMS.
Y quisiera que hiciera lo mismo cuando el outputValue sea >=288; osea que me envíe un solo SMS advirtiendo que la presión subió, y que cada que estas condiciones se cumplan (outputValue <= 286 o outputValue >= 288) me envíe un mensaje.

Adjunto mi código allí vienen marcadas las partes donde necesito ayuda. Espero alguien pueda sacarme del problema

Gracias.

Código: Seleccionar todo

#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h> 
SoftwareSerial SIM900(7, 8);

int SIM900_pin = 9;
int relay_pin = 2;    
int sensorValue = 0;        
int outputValue = 0;      
int timesToSend = 1;
int count = 0;
const int analogInPin = A0; 



String incomingData;   
String message = "";   


#define DHTPIN 4     
#define DHTTYPE DHT11   
DHT dht(DHTPIN, DHTTYPE); 


int chk;
float hum;  
float temp;

#define I2C_ADDR    0x27

LiquidCrystal_I2C             lcd(I2C_ADDR, 2, 1, 0, 4, 5, 6, 7);

char incoming_char; 

byte charGrado[8] = {
  0b01110,
  0b01010,
  0b01110,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};


void setup()
{
  dht.begin();

  lcd.begin (16, 2);  
  lcd.setBacklightPin(3, POSITIVE);
  lcd.setBacklight(HIGH);

  lcd.createChar(0, charGrado);

  digitalWrite(9, LOW);
  delay(1000);
  digitalWrite(9, HIGH);
  delay(2000);
  digitalWrite(9, LOW);
  delay(2000);

  pinMode(SIM900_pin, OUTPUT);   
  Serial.begin(19200); 
  SIM900.begin(19200); 
  Serial.println("OK");
  delay (1000);

  pinMode(relay_pin, OUTPUT);   
  digitalWrite(relay_pin, LOW);  

 
  SIM900.print("AT+CMGF=1\r");
  delay(1000);


  SIM900.print("AT+CNMI=2,2,0,0,0\r");
  delay(1000);
}

void loop()
{
  if (SIM900.available() > 0)
  {
    incomingData = SIM900.read(); 
    Serial.print(incomingData); 
  }

  if (incomingData.indexOf("Temp") >= 0 || incomingData.indexOf("TEMP") >= 0)
  {
    leeDatos();
    mensaje_sms();
    Serial.println(incoming_char);
  }
  {
    
    receive_message();

 
    sensorValue = analogRead(analogInPin);

    outputValue = map(sensorValue, 262, 389, 10, 30);



    Serial.print("sensor = ");
    Serial.print(sensorValue);
    Serial.print(" PSI ");
    Serial.println(outputValue);
    delay(1000);


    if (sensorValue <= 286)
    {
      while (count < timesToSend)
      {
        digitalWrite(sensorValue, 286);
        delay(1000);
        message = "Alerta: Presion baja 15 PSI";
        delay(500);
        send_message(message);
        delay(500);
        Serial.write(0x1A);
        delay(2000);
        count++;
      }
    }
  }


  if (incomingData.indexOf("RESET ON") >= 0 || incomingData.indexOf("Reset on") >= 0)

  {
    pinMode(SIM900_pin, OUTPUT);   
    digitalWrite(SIM900_pin, LOW);  

    Serial.begin(19200); 
    SIM900.begin(19200); 

    pinMode(relay_pin, OUTPUT);   
    digitalWrite(relay_pin, LOW); 

   
    SIM900.print("AT+CMGF=1\r");
    delay(100);

    
    SIM900.print("AT+CNMI=2,2,0,0,0\r");
    delay(100);
    {
      digitalWrite(relay_pin, LOW);
      message = "Reseted on";
     
      send_message(message);
    }
  }

 
  if (incomingData.indexOf("RESET OFF") >= 0 || incomingData.indexOf("Reset off") >= 0)

  {
    pinMode(SIM900_pin, OUTPUT);   // Setting erlay pin as output pin
    digitalWrite(SIM900_pin, LOW);  // Making relay pin initailly ON

    Serial.begin(19200); // baudrate for serial monitor
    SIM900.begin(19200); // baudrate for GSM shield

    pinMode(relay_pin, OUTPUT);   // Setting erlay pin as output pin
    digitalWrite(relay_pin, HIGH);  // Making relay pin initailly ON

    
    SIM900.print("AT+CMGF=1\r");
    delay(100);

   
    SIM900.print("AT+CNMI=2,2,0,0,0\r");
    delay(100);
    {
      digitalWrite(relay_pin, HIGH);
      message = "Reseted off";
      
      send_message(message);
    }
  }

 
  if (incomingData.indexOf("ON1") >= 0 || incomingData.indexOf("On1") >= 0 || incomingData.indexOf("on1") >= 0)
  {
    digitalWrite(relay_pin, LOW);
    message = "Bomba 1 ON";
   
    send_message(message);
  }

  
  if (incomingData.indexOf("OFF1") >= 0 || incomingData.indexOf("Off1") >= 0 || incomingData.indexOf("off1") >= 0)
  {
    digitalWrite(relay_pin, HIGH);
    message = "Bomba 1 OFF";
    
    send_message(message);
  }

 
  if (incomingData.indexOf("PSI") >= 0 || incomingData.indexOf("Psi") >= 0 || incomingData.indexOf("psi") >= 0)
  {
    digitalWrite, (sensorValue);
    message = outputValue;
    
    send_message2(message + " PSI ");
  }

  if (incomingData.indexOf("STATE") >= 0 || incomingData.indexOf("State") >= 0 || incomingData.indexOf("state") >= 0)
  {
    if  /////("Como hacer que me envie un SMS con el estatis del relay?")
    {
      message = "Bomba 1 On";
      send_message3(message);
      Serial.println("Relay state resquest");
      Serial.println("SMS enviado");
    }
    if   ///// ("Como hacer que me envie un SMS con el estatis del relay?")
    {
      message = "Bomba 1 Off";
      send_message4(message);
      Serial.println("Relay state resquest");
      Serial.println("SMS enviado");
    }
  }
}

void leeDatos()
{

  hum = dht.readHumidity();
  temp = dht.readTemperature();

  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.print(" %, Temp: ");
  Serial.print(temp);
  Serial.println(" Celsius");

  lcd.home ();                   
  lcd.print("Temp:");
  lcd.setCursor ( 6, 0 );
  lcd.print(temp);
  lcd.setCursor ( 12, 0 );
  lcd.write(byte(0));
  lcd.setCursor ( 13, 0 );
  lcd.print("C");
  lcd.setCursor ( 0, 1 );
  lcd.print("Hum:");
  lcd.setCursor ( 6, 1 );
  lcd.print(hum);
  lcd.setCursor ( 12, 1 );
  lcd.print("%");
}

void receive_message()
{
  if (SIM900.available() > 0)
  {
    incomingData = SIM900.readString();
    Serial.print(incomingData);
    delay(10);
  }
}

void send_message(String message)
{
  SIM900.println("AT+CMGF=1");    
  delay(100);
  SIM900.println("AT+CMGS=\"xxxxxxxxxxx\""); 
  delay(100);
  SIM900.println(message);   
  delay(100);
  SIM900.println((char)26);  
  delay(100);
  SIM900.println();
  delay(1000);
}

void send_message2(String message)
{
  SIM900.println("AT+CMGF=1");    
  delay(100);
  SIM900.println("AT+CMGS=\"+xxxxxxxxxx\"");
  delay(100);
  SIM900.println(message);  
  delay(100);
  SIM900.println((char)26); 
  delay(100);
  SIM900.println();
  delay(1000);
}

void send_message3(String message)

{
  SIM900.println("AT+CMGF=1");    
  delay(100);
  SIM900.println("AT+CMGS=\"xxxxxxxxx\""); 
  delay(100);
  SIM900.println(message);  
  delay(100);
  SIM900.println((char)26); 
  delay(100);
  SIM900.println();
  delay(1000);
}

void send_message4(String message)

{
  SIM900.println("AT+CMGF=1");    
  delay(100);
  SIM900.println("AT+CMGS=\"xxxxxxxxxx\""); 
  delay(100);
  SIM900.println(message);   
  delay(100);
  SIM900.println((char)26);  /
  delay(100);
  SIM900.println();
  delay(1000);
}

void mensaje_sms()
{
  Serial.println("Enviando SMS...");
  SIM900.print("AT+CMGF=1\r"); 
  delay(1000);
  SIM900.println("AT + CMGS = \"+xxxxxxxxx\""); correcto.
  delay(1000);
  SIM900.println("INFO METEO: " );
  delay(100);
  SIM900.print("Temperatura: " );
  delay(100);
  SIM900.print(temp);
  delay(100);
  SIM900.println(" Gr. Celsius, " );
  delay(100);
  SIM900.print("Humedad: " );
  delay(100);
  SIM900.print(hum);
  delay(100);
  SIM900.println("%" );
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(2000); 
  Serial.println("SMS enviado");
  incomingData = '0';
}

Avatar de Usuario
Sigmundfreud
Mensajes: 236
Registrado: Mar Feb 12, 2019 8:23 pm
Ubicación: Girona

Re: Envio de SMS con SIM900 y arduino UNO

Mensaje por Sigmundfreud » Jue Abr 25, 2019 7:28 am

buenos días yuxer,

sé que yo mismo te informé de este foro, pero sería recomendable que te leyeras las normas del foro y te presentaras a todos.

sobre el problema que preguntas.

entiendo que todo lo demás del skecht te funciona no?

vamos a por el estado de los reles, yo tengo funcionando algo parecido, en mi caso tengo tres reles conectados a tres magnetotermicos del cuadro y en el caso que se falle alguno el rele activa una entrada del arduino y me llega un sms, si yo le hago una perdida a la sim900 me dice en el estado que se encuentra casa térmico.

prueba esto.

crea una variable boleana que sea estado_bomba=false;
esta cada vez que la bomba este activa que pase al true o bomba apagada a false.

Código: Seleccionar todo

if (incomingData.indexOf("STATE") >= 0 || incomingData.indexOf("State") >= 0 || incomingData.indexOf("state") >= 0)
  {
    if   (estado_bomba==true)
    {
      message = "Bomba 1 On";
      send_message3(message);
      Serial.println("Relay state resquest");
      Serial.println("SMS enviado");
    }
    else if   ///// (estado_bomba==false)
    {
      message = "Bomba 1 Off";
      send_message4(message);
      Serial.println("Relay state resquest");
      Serial.println("SMS enviado");
    }

Para la pregunta de los sms según la presión yo haría una función contador y que sea esta quien llame a la función de enviar el sms por presion, crea una variable contador

int contador_sms_presion=0;

Código: Seleccionar todo

void loop{

if ( outputValue >= 288){
contador_sms_presion++;
if (contador_sms_presion==2)
{   message = outputValue;
    
    send_message2(message + " PSI ");
    contador_sms_presion==3;}  /// para que pare en enviarte sms
    
 else if    ( outputValue <= 286){
contador_sms_presion--;
if (contador_sms_presion==-2)
{   message = outputValue;
    
    send_message2(message + " PSI ");
    contador_sms_presion==-3;}
    
  else if    ( outputValue == 287){
contador_sms_presion=0;}
  

pruebalo así, yo creo que tendría que funcionar

YUXER
Mensajes: 3
Registrado: Mié Abr 24, 2019 12:28 am

Re: Envio de SMS con SIM900 y arduino UNO

Mensaje por YUXER » Lun Abr 29, 2019 1:43 am

Muchas gracias por estar al pendiente, ya había pensado en hacer una variable booleana solo que no sabía muy bien como estructurarla, utilizare tus ejemplos y probaré.

Nuevamente muchas gracias por el interés.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado