Advertisement
Guest User

Untitled

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