Официальный сайт компании Arduino по адресу arduino.cc
Помогите довезти код до ума (управление отоплением по 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х строках температуру на дисплей?