Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <DHT.h>
- #include <avr/wdt.h>
- #include <SoftwareSerial.h>
- char str_temp[6];
- char text[30];
- /* For TEST MSG */
- String _response = ""; // Переменная для хранения ответа модуля
- long lastUpdate = millis(); // Время последнего обновления
- long updatePeriod = 60000; // Проверять каждую минуту
- bool hasmsg = false; // Флаг наличия сообщений к удалению
- /* Pin`s Setup */
- #define DHTPIN1 2 // Sensor #1
- #define DHTPIN2 3 // Sensor #2
- #define DHTPIN3 4 // Sensor #3
- #define DHTPIN4 5 // Sensor #4
- SoftwareSerial SIM800(9, 8);
- /* Sensor Init */
- DHT dht1(DHTPIN1, DHT22);
- DHT dht2(DHTPIN2, DHT22);
- DHT dht3(DHTPIN3, DHT22);
- DHT dht4(DHTPIN4, DHT22);
- /* Variables */
- /* Real Data */
- float h1,h2,h3,h4; // Влажность
- float t1,t2,t3,t4; // Температура
- /* History Data */
- float h1_his, h2_his, h3_his, h4_his; // История влажности
- float t1_his, t2_his, t3_his, t4_his; // История температуры
- /* Timer`s */
- unsigned long read_timer, check_timer; // Read Timer and Check Timer
- char msg[15]; // Message for sending data
- /* Get Message DATA */
- char get_msg[35]; // Get Message
- /**/
- String _response = "";
- /* Function`s */
- /* #1 Init Sensors */
- void sensor_init() {
- dht1.begin(); // Init #1 Sensor
- dht2.begin(); // Init #2 Sensor
- dht3.begin(); // Init #3 Sensor
- dht4.begin(); // Init #4 Sensor
- }
- /* #2 Read Sensor`s */
- void read_sensor() {
- if((millis() - read_timer) >= 2500) { // 5sec pause
- /* Get Temperature */
- t1 = dht1.readTemperature();
- t2 = dht2.readTemperature();
- t3 = dht3.readTemperature();
- t4 = dht4.readTemperature();
- /* Get Humidity */
- h1 = dht1.readHumidity();
- h2 = dht2.readHumidity();
- h3 = dht3.readHumidity();
- h4 = dht4.readHumidity();
- /* Update Timer */
- read_timer = millis();
- }
- }
- /* #3 Send Data */
- void send_data(int mode, int sensor, float data) {
- switch (mode) {
- case 1: // Send Temperature
- sprintf(msg, "Temp #%d %g", sensor, data);
- Serial.println(msg);
- break;
- case 2: // Send Humidity
- sprintf(msg, "Humi #%d %g", sensor, data);
- Serial.println(msg);
- break;
- }
- }
- /* #4 Data analysis */
- void data_check() {
- if((millis() - check_timer) >= 60000) { // 1min (60sec) pause
- /* Анализ температуры */
- if((t1 - t1_his) > 1) {
- t1_his = t1; // Update history
- send_data(1, 1, t1); // Send data
- }
- if((t2 - t2_his) > 1) {
- t2_his = t2; // Update history
- send_data(1, 2, t2); // Send data
- }
- if((t3 - t3_his) > 1) {
- t3_his = t3; // Update history
- send_data(1, 3, t3); // Send data
- }
- if((t4 - t4_his) > 1) {
- t4_his = t4; // Update history
- send_data(1, 4, t4); // Send data
- }
- /* Анализ влажности */
- if((h1 - h1_his) > 1) {
- h1_his = h1; // Update history
- send_data(2, 1, h1); // Send data
- }
- if((h2 - h2_his) > 1) {
- h2_his = h2; // Update history
- send_data(2, 2, h2); // Send data
- }
- if((h3 - h3_his) > 1) {
- h3_his = h3; // Update history
- send_data(2, 3, h3); // Send data
- }
- if((h4 - h4_his) > 1) {
- h4_his = h4; // Update history
- send_data(2, 4, h4); // Send data
- }
- /* Update Timer */
- check_timer = millis();
- }
- }
- String sendATCommand(String cmd, bool waiting) {
- String _resp = ""; // Переменная для хранения результата
- Serial.println(cmd); // Дублируем команду в монитор порта
- SIM800.println(cmd); // Отправляем команду модулю
- if (waiting) { // Если необходимо дождаться ответа...
- _resp = waitResponse(); // ... ждем, когда будет передан ответ
- // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
- if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
- _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
- }
- Serial.println(_resp); // Дублируем ответ в монитор порта
- }
- return _resp; // Возвращаем результат. Пусто, если проблема
- }
- String waitResponse() { // Функция ожидания ответа и возврата полученного результата
- String _resp = ""; // Переменная для хранения результата
- long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
- while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
- if (SIM800.available()) { // Если есть, что считывать...
- _resp = SIM800.readString(); // ... считываем и запоминаем
- }
- else { // Если пришел таймаут, то...
- Serial.println("Timeout..."); // ... оповещаем об этом и...
- }
- return _resp; // ... возвращаем результат. Пусто, если проблема
- }
- void sendSMS(String phone, String message)
- {
- sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
- sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
- }
- void sim800_process() {
- if (SIM800.available()) { // Если модем, что-то отправил...
- _response = waitResponse(); // Получаем ответ от модема для анализа
- _response.trim(); // Убираем лишние пробелы в начале и конце
- Serial.println(_response); // Если нужно выводим в монитор порта
- //....
- if (_response.startsWith("+CMGS:")) { // Пришло сообщение об отправке SMS
- int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом
- String result = _response.substring(index + 2, _response.length()); // Получаем статус
- result.trim(); // Убираем пробельные символы в начале/конце
- if (result == "OK") { // Если результат ОК - все нормально
- Serial.println ("Message was sent. OK");
- }
- else { // Если нет, нужно повторить отправку
- Serial.println ("Message was not sent. Error");
- }
- }
- }
- if (Serial.available()) { // Ожидаем команды по Serial...
- SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
- };
- }
- /* FOR TEST MSG */
- String waitResponse() { // Функция ожидания ответа и возврата полученного результата
- String _resp = ""; // Переменная для хранения результата
- long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
- while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
- if (SIM800.available()) { // Если есть, что считывать...
- _resp = SIM800.readString(); // ... считываем и запоминаем
- }
- else { // Если пришел таймаут, то...
- Serial.println("Timeout..."); // ... оповещаем об этом и...
- }
- return _resp; // ... возвращаем результат. Пусто, если проблема
- }
- void parseSMS(String msg) { // Парсим SMS
- String msgheader = "";
- String msgbody = "";
- String msgphone = "";
- msg = msg.substring(msg.indexOf("+CMGR: "));
- msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
- msgbody = msg.substring(msgheader.length() + 2);
- msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
- msgbody.trim();
- /*int firstIndex = msgheader.indexOf("\",\"") + 3;
- int secondIndex = msgheader.indexOf("\",\"", firstIndex);
- msgphone = msgheader.substring(firstIndex, secondIndex);*/
- if(msgbody == "Test") {
- sendSMS("+79538533436", "OK!!!!");
- }
- }
- /* TEST FUNCTION */
- void test_function() {
- static bool send_fl, send_danger;
- static unsigned long send_pause, send_pause_danger;
- /* #Check Temperature Level */
- /* 24 - Warn / 30 - DANGER */
- if((t1 >= 24 && t1 <= 29) || (t2 >= 24 && t2 <= 29) || (t3 >= 24 && t3 <= 29) || (t4 >= 24 && t4 <= 29)) {
- // Send warn msg
- if(!send_fl) {
- if(t1 == 24) {
- dtostrf(t1, 4, 2, str_temp);
- sprintf(text,"WARNING! SENSOR #1 %s C", str_temp);
- sendSMS("+79538533436", text);
- //sendSMS("+79029288910", "WARNING! SENSOR #1 >23C");
- send_pause = millis();
- send_fl = true;
- } else if(t2 == 24) {
- //sendSMS("+79029288910", "WARNING! SENSOR #2 >23C");
- //send_pause = millis();
- //send_fl = true;
- } else if(t3 == 24) {
- //sendSMS("+79029288910", "WARNING! SENSOR #3 >23C");
- //send_pause = millis();
- //send_fl = true;
- } else if(t4 == 24) {
- //sendSMS("+79029288910", "WARNING! SENSOR #4 >23C");
- //send_pause = millis();
- //send_fl = true;
- }
- }
- if(send_fl) {
- if((millis() - send_pause) >= 900000) { // 15min pause
- send_fl = false;
- }
- }
- }
- if(t1 >= 30 || t2 >= 30 || t3 >= 30 || t4 >= 30) {
- // send danger msg
- if(!send_danger) {
- if(t1 >= 30) {
- dtostrf(t1, 4, 2, str_temp);
- sprintf(text,"DANGER! SENSOR #1 %s C", str_temp);
- sendSMS("+79538533436", text);
- send_pause_danger = millis();
- send_danger = true;
- } else if(t2 >= 30) {
- //sendSMS("+79029288910", "DANGER! SENSOR #2 >29C");
- //send_pause_danger = millis();
- //send_danger = true;
- } else if(t3 >= 30) {
- //sendSMS("+79029288910", "DANGER! SENSOR #3 >29C");
- //send_pause_danger = millis();
- //send_danger = true;
- } else if(t4 >= 30) {
- //sendSMS("+79029288910", "DANGER! SENSOR #4 >29C");
- //send_pause_danger = millis();
- //send_danger = true;
- }
- }
- if(send_danger) {
- if((millis() - send_pause_danger) >= 300000) { // 5min
- send_danger = false;
- }
- }
- }
- /* #Read "Test" Message */
- }
- /* TEST FUNCTION */
- /* Setup Program */
- void setup() {
- //wdt_disable();
- Serial.begin(9600);
- sensor_init(); // Setup Sensor`s
- SIM800.begin(9600);
- sendATCommand("AT", true);
- sendSMS("+79538533436", "Module ON");
- //wdt_enable(WDTO_8S);
- /* FOR TEST MSG */
- lastUpdate = millis(); // Обнуляем таймер
- }
- void loop() {
- //wdt_reset();
- read_sensor(); // Read Sensor`s
- data_check(); // Check change data
- sim800_process();
- serial_process();
- /* TEST Function !!! */
- test_function();
- /* TEST FUNCTION */
- /* FOR TEST MSG */
- if (lastUpdate + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
- do {
- _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
- if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
- int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
- char i = 0; // Объявляем счетчик попыток
- do {
- i++; // Увеличиваем счетчик
- _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
- _response.trim(); // Убираем пробелы в начале/конце
- if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
- if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
- sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
- sendATCommand("\n", true); // Перестраховка - вывод новой строки
- parseSMS(_response); // Отправляем текст сообщения на обработку
- break; // Выход из do{}
- }
- else { // Если сообщение не заканчивается на OK
- Serial.println ("Error answer"); // Какая-то ошибка
- sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
- }
- } while (i < 10);
- break;
- }
- else {
- lastUpdate = millis(); // Обнуляем таймер
- if (hasmsg) {
- sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
- hasmsg = false;
- }
- break;
- }
- } while (1);
- }
- if (SIM800.available()) { // Если модем, что-то отправил...
- _response = waitResponse(); // Получаем ответ от модема для анализа
- _response.trim(); // Убираем лишние пробелы в начале и конце
- Serial.println(_response); // Если нужно выводим в монитор порта
- if (_response.indexOf("+CMTI:")>-1) { // Пришло сообщение об отправке SMS
- lastUpdate = millis() - updatePeriod; // Теперь нет необходимости обрабатываеть SMS здесь, достаточно просто
- // сбросить счетчик автопроверки и в следующем цикле все будет обработано
- }
- }
- if (Serial.available()) { // Ожидаем команды по Serial...
- SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement