Помогите довезти код до ума (управление отоплением по SMS)
- Войдите на сайт для отправки комментариев
Сб, 07/01/2017 - 17:53
Здравствуйте, в общем суть проекта такова: Контроллер отопления будет включать и отключать нагрузку (ТЭН) по смс сообщению, дополнительно можно запросить состояние системы. Так же к ардуино подключен дисплей по I2c, температурных датчиков ds18b20 2шт. На данный момент включение и отключение нагрузки работает, обработка смс State проходит но ничего не отправляется, хотя в серийном мониторе пишет что отправлено. Разобраться с функцией State не могу, скорее всего что то с формированием сообщения что-то не то. Помогите пожалуйста
// Необходимые Библиотеки
#include <OneWire.h>
#include <DallasTemperature.h>
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
// Температуру считываем со 2 пина реле на 8
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9
#define RELAY 8
#define PHONE_NUMBER "+7xxxxxxxxx" //Номер для отправки сообщений
//Описываем сообщения для отправки
#define HELLO_MESSAGE "Hello from GPRS Shield!"
#define READY_MESSAGE "I'm ready!"
#define DANGER_MESSAGE "Current temperature is bigger than 38C. Relay is off."
#define HEATERON "OK, heater is on."
#define HEATEROFF "OK, heater is off."
float tempC1;
float tempC2;
String helloText = "Hello from GPRS Shield!";
String tempText = "Tempreature is ";
String termValue = String(tempC1, tempC2);
String degree = " C.";
String heaterOn = "Heater is On.";
String heaterOff = "Heater is Off.";
String message_to_send;
char char_message_to_send[60];
// текст сообщения
char message[160];
// номер, с которого пришло сообщение
char phone[16];
// дата отправки сообщения
char datetime[24];
bool stateRelay = false; //Состояние реле
GPRS gprs;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;
void setup(void)
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
//lcd.print("iarduino.ru");
//lcd.setCursor(8, 1);
//lcd.print("LCD 1602");
//Включаем GPRS Shield, эмулируя нажатие кнопки POWER
pinMode(9, OUTPUT);
digitalWrite(9, HIGH); // Подаем High на пин 9
delay(3000); // на 3 секунды
digitalWrite(9, LOW); // и отпускаем в Low.
delay(5000); // Ждём 5 секунд для старта шилда
// start serial port
Serial.begin(9600);
//Serial.println("Dallas Temperature IC Control Library Demo");
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
// Start up the library
sensors.begin();
Serial.println("Start");
//gprs.powerUpDown();
while (!gprs.init())
{
delay(1000);
Serial.println("Connecting");
}
// method 1: by index
if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");
// set the resolution to 9 bit per device
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
}
// Функция получения температуры
//tempC1 внешняя температура
//tempC2 ткмпература жидкости
void printTemperature(DeviceAddress deviceAddress)
{
tempC1 = sensors.getTempC(insideThermometer);
// Устанавливаем курсор на вторую строку и нулевой символ.
lcd.setCursor(0, 1);
lcd.print("TempC1: ");
lcd.println(tempC1);
tempC2 = sensors.getTempC(outsideThermometer);
lcd.setCursor(0, 1);
lcd.print("TempC2: ");
lcd.println(tempC2);
delay(1000);
}
void loop(void)
{
printTemperature(outsideThermometer);
//Ждем сообщения
if (gprs.ifSMSNow())
{
gprs.readSMS(message, phone, datetime);
Serial.println("Message");
inc_sms(message);
}
//Получаем текущую температуру
tempC1 = sensors.getTempC(insideThermometer);
lcd.setCursor(0, 0);
lcd.print("TempC1: ");
lcd.println(tempC1);
tempC2 = sensors.getTempC(outsideThermometer);
lcd.setCursor(0, 1);
lcd.print("TempC2: ");
lcd.println(tempC2);
}
//Проверяем входящее SMS
void inc_sms(char f_message[])
{
if(strcmp(f_message, "State") == 0)
{
Serial.println("Calling for state function");
state();
}
else if(strcmp(f_message, "HeaterOn") == 0)
{
digitalWrite(RELAY, HIGH);
stateRelay = true;
gprs.sendSMS(PHONE_NUMBER, HEATERON);
}
else if(strcmp(f_message, "HeaterOff") == 0)
{
digitalWrite(RELAY, LOW);
stateRelay = false;
gprs.sendSMS(PHONE_NUMBER, HEATEROFF);
}
else
{
Serial.println("Error");
}
}
//Готовим и отправляем SMS со статусом
void state()
{
if(stateRelay)
{
message_to_send = String(helloText + tempText + termValue + degree + heaterOn);
message_to_send.toCharArray(char_message_to_send, 100);
Serial.println("Sending");
gprs.sendSMS(PHONE_NUMBER, char_message_to_send);
Serial.println("Sent");
}
else if(!stateRelay)
{
message_to_send = String(helloText + tempText + termValue + degree + heaterOff);
message_to_send.toCharArray(char_message_to_send, 100);
Serial.println("Sending");
gprs.sendSMS(PHONE_NUMBER, char_message_to_send);
Serial.println("Sent");
}
}
разобраться с получением температуры с 2х датчиков по смс и вывести в 2х строках температуру на дисплей?