GPRS shield и температурный датчик

lori
Offline
Зарегистрирован: 25.02.2014

Всем привет! Уже весь день не могу решить простейшую задачу:

1) Есть arduino uno, gprs shield sim 900, аналоговый температурный датчик tmp36, твердотельное реле.

2)Необходимо чтобы температурный датчик постоянно следил за температурой и отправлял данные в serial/

3)Необходимо сделать так, чтоб при отправке sms включалось реле.

Поставил шилд, взял 2 проги, первая следит за температурой, вторая принимает смс. По отдельности всё работает, когда соединяю эти программы, работает только датчик, смс не принимаются.

Вот код (в коде реле обозначены, как светодиоды ):

#include <SoftwareSerial.h>

SoftwareSerial gprsSerial(7, 8);

//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;

void setup()
{
gprsSerial.begin(19200);
Serial.begin(9600);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);

// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}

void loop()
{
while (true) {
if (!gprsSerial.available())
return;
tempreture();
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
Serial.println ("222");
if (isStringMessage) {
Serial.println ("333");
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}

}
void tempreture()
{
float voltage = 5.0 / 1024.0 * analogRead(0);
Serial.print(voltage);
Serial.println(" B");
float tempC = ( voltage - 0.5 ) * 100;
Serial.print(tempC);
Serial.println(" C");
delay(1000);
}

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013
while (true) {
if (!gprsSerial.available())
return;
temperaure();

А это зачем лишние while и return?

Проще нужно быть:

loop(){
   if ( gprsSerial.available() ){
      // Проверяем и обрабатываемSMS  
   }
// Считываем температуру и пишем в сериал
   temperaure();
}

И с СМСками лучше готовую либу поставить, например GSM_GPRS

Там, ИМХО, поудобнее работать, чем напрямую с портом SIM900