Управление нагрузкой по 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 нужно сделать глобальными.