Помогите довезти код до ума (управление отоплением по SMS)

Нет ответов
gatsby163
Offline
Зарегистрирован: 10.03.2014

Здравствуйте, в общем суть проекта такова: Контроллер отопления будет включать и отключать нагрузку (ТЭН) по смс сообщению, дополнительно можно запросить состояние системы. Так же к ардуино подключен дисплей по 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х строках температуру на дисплей?