Advertisement
Guest User

Untitled

a guest
May 20th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.43 KB | None | 0 0
  1. #include <DHT.h>
  2. #include <avr/wdt.h>
  3. #include <SoftwareSerial.h>
  4. char str_temp[6];
  5. char text[30];
  6.  
  7. /* For TEST MSG */
  8. String _response = ""; // Переменная для хранения ответа модуля
  9. long lastUpdate = millis(); // Время последнего обновления
  10. long updatePeriod = 60000; // Проверять каждую минуту
  11. bool hasmsg = false; // Флаг наличия сообщений к удалению
  12.  
  13. /* Pin`s Setup */
  14. #define DHTPIN1 2 // Sensor #1
  15. #define DHTPIN2 3 // Sensor #2
  16. #define DHTPIN3 4 // Sensor #3
  17. #define DHTPIN4 5 // Sensor #4
  18. SoftwareSerial SIM800(9, 8);
  19.  
  20. /* Sensor Init */
  21. DHT dht1(DHTPIN1, DHT22);
  22. DHT dht2(DHTPIN2, DHT22);
  23. DHT dht3(DHTPIN3, DHT22);
  24. DHT dht4(DHTPIN4, DHT22);
  25.  
  26. /* Variables */
  27. /* Real Data */
  28. float h1,h2,h3,h4; // Влажность
  29. float t1,t2,t3,t4; // Температура
  30. /* History Data */
  31. float h1_his, h2_his, h3_his, h4_his; // История влажности
  32. float t1_his, t2_his, t3_his, t4_his; // История температуры
  33. /* Timer`s */
  34. unsigned long read_timer, check_timer; // Read Timer and Check Timer
  35. char msg[15]; // Message for sending data
  36. /* Get Message DATA */
  37. char get_msg[35]; // Get Message
  38. /**/
  39. String _response = "";
  40.  
  41. /* Function`s */
  42. /* #1 Init Sensors */
  43. void sensor_init() {
  44. dht1.begin(); // Init #1 Sensor
  45. dht2.begin(); // Init #2 Sensor
  46. dht3.begin(); // Init #3 Sensor
  47. dht4.begin(); // Init #4 Sensor
  48. }
  49. /* #2 Read Sensor`s */
  50. void read_sensor() {
  51. if((millis() - read_timer) >= 2500) { // 5sec pause
  52. /* Get Temperature */
  53. t1 = dht1.readTemperature();
  54. t2 = dht2.readTemperature();
  55. t3 = dht3.readTemperature();
  56. t4 = dht4.readTemperature();
  57. /* Get Humidity */
  58. h1 = dht1.readHumidity();
  59. h2 = dht2.readHumidity();
  60. h3 = dht3.readHumidity();
  61. h4 = dht4.readHumidity();
  62. /* Update Timer */
  63. read_timer = millis();
  64. }
  65. }
  66. /* #3 Send Data */
  67. void send_data(int mode, int sensor, float data) {
  68. switch (mode) {
  69. case 1: // Send Temperature
  70. sprintf(msg, "Temp #%d %g", sensor, data);
  71. Serial.println(msg);
  72. break;
  73. case 2: // Send Humidity
  74. sprintf(msg, "Humi #%d %g", sensor, data);
  75. Serial.println(msg);
  76. break;
  77. }
  78. }
  79. /* #4 Data analysis */
  80. void data_check() {
  81. if((millis() - check_timer) >= 60000) { // 1min (60sec) pause
  82. /* Анализ температуры */
  83. if((t1 - t1_his) > 1) {
  84. t1_his = t1; // Update history
  85. send_data(1, 1, t1); // Send data
  86. }
  87. if((t2 - t2_his) > 1) {
  88. t2_his = t2; // Update history
  89. send_data(1, 2, t2); // Send data
  90. }
  91. if((t3 - t3_his) > 1) {
  92. t3_his = t3; // Update history
  93. send_data(1, 3, t3); // Send data
  94. }
  95. if((t4 - t4_his) > 1) {
  96. t4_his = t4; // Update history
  97. send_data(1, 4, t4); // Send data
  98. }
  99. /* Анализ влажности */
  100. if((h1 - h1_his) > 1) {
  101. h1_his = h1; // Update history
  102. send_data(2, 1, h1); // Send data
  103. }
  104. if((h2 - h2_his) > 1) {
  105. h2_his = h2; // Update history
  106. send_data(2, 2, h2); // Send data
  107. }
  108. if((h3 - h3_his) > 1) {
  109. h3_his = h3; // Update history
  110. send_data(2, 3, h3); // Send data
  111. }
  112. if((h4 - h4_his) > 1) {
  113. h4_his = h4; // Update history
  114. send_data(2, 4, h4); // Send data
  115. }
  116. /* Update Timer */
  117. check_timer = millis();
  118. }
  119. }
  120.  
  121. String sendATCommand(String cmd, bool waiting) {
  122. String _resp = ""; // Переменная для хранения результата
  123. Serial.println(cmd); // Дублируем команду в монитор порта
  124. SIM800.println(cmd); // Отправляем команду модулю
  125. if (waiting) { // Если необходимо дождаться ответа...
  126. _resp = waitResponse(); // ... ждем, когда будет передан ответ
  127. // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
  128. if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
  129. _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
  130. }
  131. Serial.println(_resp); // Дублируем ответ в монитор порта
  132. }
  133. return _resp; // Возвращаем результат. Пусто, если проблема
  134. }
  135.  
  136. String waitResponse() { // Функция ожидания ответа и возврата полученного результата
  137. String _resp = ""; // Переменная для хранения результата
  138. long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
  139. while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  140. if (SIM800.available()) { // Если есть, что считывать...
  141. _resp = SIM800.readString(); // ... считываем и запоминаем
  142. }
  143. else { // Если пришел таймаут, то...
  144. Serial.println("Timeout..."); // ... оповещаем об этом и...
  145. }
  146. return _resp; // ... возвращаем результат. Пусто, если проблема
  147. }
  148.  
  149. void sendSMS(String phone, String message)
  150. {
  151. sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
  152. sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
  153. }
  154.  
  155. void sim800_process() {
  156. if (SIM800.available()) { // Если модем, что-то отправил...
  157. _response = waitResponse(); // Получаем ответ от модема для анализа
  158. _response.trim(); // Убираем лишние пробелы в начале и конце
  159. Serial.println(_response); // Если нужно выводим в монитор порта
  160. //....
  161. if (_response.startsWith("+CMGS:")) { // Пришло сообщение об отправке SMS
  162. int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом
  163. String result = _response.substring(index + 2, _response.length()); // Получаем статус
  164. result.trim(); // Убираем пробельные символы в начале/конце
  165.  
  166. if (result == "OK") { // Если результат ОК - все нормально
  167. Serial.println ("Message was sent. OK");
  168. }
  169. else { // Если нет, нужно повторить отправку
  170. Serial.println ("Message was not sent. Error");
  171. }
  172. }
  173. }
  174. if (Serial.available()) { // Ожидаем команды по Serial...
  175. SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
  176. };
  177. }
  178.  
  179. /* FOR TEST MSG */
  180. String waitResponse() { // Функция ожидания ответа и возврата полученного результата
  181. String _resp = ""; // Переменная для хранения результата
  182. long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
  183. while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  184. if (SIM800.available()) { // Если есть, что считывать...
  185. _resp = SIM800.readString(); // ... считываем и запоминаем
  186. }
  187. else { // Если пришел таймаут, то...
  188. Serial.println("Timeout..."); // ... оповещаем об этом и...
  189. }
  190. return _resp; // ... возвращаем результат. Пусто, если проблема
  191. }
  192.  
  193. void parseSMS(String msg) { // Парсим SMS
  194. String msgheader = "";
  195. String msgbody = "";
  196. String msgphone = "";
  197.  
  198. msg = msg.substring(msg.indexOf("+CMGR: "));
  199. msgheader = msg.substring(0, msg.indexOf("\r")); // Выдергиваем телефон
  200.  
  201. msgbody = msg.substring(msgheader.length() + 2);
  202. msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK")); // Выдергиваем текст SMS
  203. msgbody.trim();
  204.  
  205. /*int firstIndex = msgheader.indexOf("\",\"") + 3;
  206. int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  207. msgphone = msgheader.substring(firstIndex, secondIndex);*/
  208.  
  209. if(msgbody == "Test") {
  210. sendSMS("+79538533436", "OK!!!!");
  211. }
  212. }
  213.  
  214. /* TEST FUNCTION */
  215. void test_function() {
  216. static bool send_fl, send_danger;
  217. static unsigned long send_pause, send_pause_danger;
  218. /* #Check Temperature Level */
  219. /* 24 - Warn / 30 - DANGER */
  220. if((t1 >= 24 && t1 <= 29) || (t2 >= 24 && t2 <= 29) || (t3 >= 24 && t3 <= 29) || (t4 >= 24 && t4 <= 29)) {
  221. // Send warn msg
  222. if(!send_fl) {
  223. if(t1 == 24) {
  224. dtostrf(t1, 4, 2, str_temp);
  225. sprintf(text,"WARNING! SENSOR #1 %s C", str_temp);
  226. sendSMS("+79538533436", text);
  227. //sendSMS("+79029288910", "WARNING! SENSOR #1 >23C");
  228. send_pause = millis();
  229. send_fl = true;
  230. } else if(t2 == 24) {
  231. //sendSMS("+79029288910", "WARNING! SENSOR #2 >23C");
  232. //send_pause = millis();
  233. //send_fl = true;
  234. } else if(t3 == 24) {
  235. //sendSMS("+79029288910", "WARNING! SENSOR #3 >23C");
  236. //send_pause = millis();
  237. //send_fl = true;
  238. } else if(t4 == 24) {
  239. //sendSMS("+79029288910", "WARNING! SENSOR #4 >23C");
  240. //send_pause = millis();
  241. //send_fl = true;
  242. }
  243. }
  244. if(send_fl) {
  245. if((millis() - send_pause) >= 900000) { // 15min pause
  246. send_fl = false;
  247. }
  248. }
  249.  
  250. }
  251. if(t1 >= 30 || t2 >= 30 || t3 >= 30 || t4 >= 30) {
  252. // send danger msg
  253. if(!send_danger) {
  254. if(t1 >= 30) {
  255. dtostrf(t1, 4, 2, str_temp);
  256. sprintf(text,"DANGER! SENSOR #1 %s C", str_temp);
  257. sendSMS("+79538533436", text);
  258. send_pause_danger = millis();
  259. send_danger = true;
  260. } else if(t2 >= 30) {
  261. //sendSMS("+79029288910", "DANGER! SENSOR #2 >29C");
  262. //send_pause_danger = millis();
  263. //send_danger = true;
  264. } else if(t3 >= 30) {
  265. //sendSMS("+79029288910", "DANGER! SENSOR #3 >29C");
  266. //send_pause_danger = millis();
  267. //send_danger = true;
  268. } else if(t4 >= 30) {
  269. //sendSMS("+79029288910", "DANGER! SENSOR #4 >29C");
  270. //send_pause_danger = millis();
  271. //send_danger = true;
  272. }
  273. }
  274. if(send_danger) {
  275. if((millis() - send_pause_danger) >= 300000) { // 5min
  276. send_danger = false;
  277. }
  278. }
  279. }
  280. /* #Read "Test" Message */
  281. }
  282. /* TEST FUNCTION */
  283.  
  284. /* Setup Program */
  285. void setup() {
  286. //wdt_disable();
  287. Serial.begin(9600);
  288. sensor_init(); // Setup Sensor`s
  289. SIM800.begin(9600);
  290. sendATCommand("AT", true);
  291. sendSMS("+79538533436", "Module ON");
  292. //wdt_enable(WDTO_8S);
  293. /* FOR TEST MSG */
  294. lastUpdate = millis(); // Обнуляем таймер
  295. }
  296.  
  297. void loop() {
  298. //wdt_reset();
  299. read_sensor(); // Read Sensor`s
  300. data_check(); // Check change data
  301. sim800_process();
  302. serial_process();
  303. /* TEST Function !!! */
  304. test_function();
  305. /* TEST FUNCTION */
  306. /* FOR TEST MSG */
  307. if (lastUpdate + updatePeriod < millis() ) { // Пора проверить наличие новых сообщений
  308. do {
  309. _response = sendATCommand("AT+CMGL=\"REC UNREAD\",1", true);// Отправляем запрос чтения непрочитанных сообщений
  310. if (_response.indexOf("+CMGL: ") > -1) { // Если есть хоть одно, получаем его индекс
  311. int msgIndex = _response.substring(_response.indexOf("+CMGL: ") + 7, _response.indexOf("\"REC UNREAD\"", _response.indexOf("+CMGL: ")) - 1).toInt();
  312. char i = 0; // Объявляем счетчик попыток
  313. do {
  314. i++; // Увеличиваем счетчик
  315. _response = sendATCommand("AT+CMGR=" + (String)msgIndex + ",1", true); // Пробуем получить текст SMS по индексу
  316. _response.trim(); // Убираем пробелы в начале/конце
  317. if (_response.endsWith("OK")) { // Если ответ заканчивается на "ОК"
  318. if (!hasmsg) hasmsg = true; // Ставим флаг наличия сообщений для удаления
  319. sendATCommand("AT+CMGR=" + (String)msgIndex, true); // Делаем сообщение прочитанным
  320. sendATCommand("\n", true); // Перестраховка - вывод новой строки
  321. parseSMS(_response); // Отправляем текст сообщения на обработку
  322. break; // Выход из do{}
  323. }
  324. else { // Если сообщение не заканчивается на OK
  325. Serial.println ("Error answer"); // Какая-то ошибка
  326. sendATCommand("\n", true); // Отправляем новую строку и повторяем попытку
  327. }
  328. } while (i < 10);
  329. break;
  330. }
  331. else {
  332. lastUpdate = millis(); // Обнуляем таймер
  333. if (hasmsg) {
  334. sendATCommand("AT+CMGDA=\"DEL READ\"", true); // Удаляем все прочитанные сообщения
  335. hasmsg = false;
  336. }
  337. break;
  338. }
  339. } while (1);
  340. }
  341.  
  342. if (SIM800.available()) { // Если модем, что-то отправил...
  343. _response = waitResponse(); // Получаем ответ от модема для анализа
  344. _response.trim(); // Убираем лишние пробелы в начале и конце
  345. Serial.println(_response); // Если нужно выводим в монитор порта
  346. if (_response.indexOf("+CMTI:")>-1) { // Пришло сообщение об отправке SMS
  347. lastUpdate = millis() - updatePeriod; // Теперь нет необходимости обрабатываеть SMS здесь, достаточно просто
  348. // сбросить счетчик автопроверки и в следующем цикле все будет обработано
  349. }
  350. }
  351. if (Serial.available()) { // Ожидаем команды по Serial...
  352. SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
  353. };
  354.  
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement