Управление нагрузкой по SMS+замер температуры.
- Войдите на сайт для отправки комментариев
Втр, 17/01/2017 - 14:51
Здравствуйте, помогите пожалуйста привести код в порядок. Планирую создать устройтство управления для теплых полов. Что бы включать и выключать нагрузку через sms, сбор показаний с 2х датчиков температуры и вывод их на дисплей по i2c. В программе 2 функции loop и temp, в loop основной цикл - ожидание смс и их обработка, вроде все должно работать - но не работает)) температуру показывает в серийном мониторе, дисплея пока нет под рукой проверить, но это не суть. Смс не обрабатываются никак(( на модуль они точно доходят но то ли не распознаются...не понятно.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
#define ONE_WIRE_BUS 4 // Датчики ds18b20 подключены на 4 пин
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = {0x28, 0xFF, 0x46, 0xB2, 0x50, 0x16, 0x04, 0xF7};
DeviceAddress sensor2 = {0x28, 0xFF, 0xA1, 0x92, 0x47, 0x16, 0x03, 0xBF};
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
int relayPin = 2;
void setup(){
Serial.begin(9600);
sensors.begin();
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.print("iarduino.ru");
lcd.setCursor(8, 1);
lcd.print("LCD 1602");
gprsSerial.begin(19200);
pinMode(relayPin, 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()
{
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Heater on")) {
digitalWrite(relayPin, HIGH);
} else if (!currStr.compareTo("Heater off")) {
digitalWrite(relayPin, 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);
}
temp();
}
void temp(){
float tempC;
sensors.requestTemperatures();
lcd.setCursor(0, 0);
Serial.print("Temp1: ");
Serial.print(sensors.getTempC(sensor1));
Serial.println("C");
lcd.setCursor(0, 1);
Serial.print("Sensor 2: ");
Serial.print(sensors.getTempC(sensor2));
Serial.println("C");
sensors.requestTemperatures();
delay(2000);
}
Переменные, объявленные в начале loop нужно сделать глобальными.