Advertisement
Guest User

Untitled

a guest
May 19th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. #include <DHT.h>
  2. #include <avr/wdt.h>
  3. #include <SoftwareSerial.h>
  4.  
  5. /* Pin`s Setup */
  6. #define DHTPIN1 2 // Sensor #1
  7. #define DHTPIN2 3 // Sensor #2
  8. #define DHTPIN3 4 // Sensor #3
  9. #define DHTPIN4 5 // Sensor #4
  10. SoftwareSerial SIM800(8, 9);
  11.  
  12. /* Sensor Init */
  13. DHT dht1(DHTPIN1, DHT22);
  14. DHT dht2(DHTPIN2, DHT22);
  15. DHT dht3(DHTPIN3, DHT22);
  16. DHT dht4(DHTPIN4, DHT22);
  17.  
  18. /* Variables */
  19. /* Real Data */
  20. float h1,h2,h3,h4; // Влажность
  21. float t1,t2,t3,t4; // Температура
  22. /* History Data */
  23. float h1_his, h2_his, h3_his, h4_his; // История влажности
  24. float t1_his, t2_his, t3_his, t4_his; // История температуры
  25. /* Timer`s */
  26. unsigned long read_timer, check_timer; // Read Timer and Check Timer
  27. char msg[15]; // Message for sending data
  28. /* Get Message DATA */
  29. char get_msg[35]; // Get Message
  30. /**/
  31. String _response = "";
  32.  
  33. /* Function`s */
  34. /* #1 Init Sensors */
  35. void sensor_init() {
  36. dht1.begin(); // Init #1 Sensor
  37. dht2.begin(); // Init #2 Sensor
  38. dht3.begin(); // Init #3 Sensor
  39. dht4.begin(); // Init #4 Sensor
  40. }
  41. /* #2 Read Sensor`s */
  42. void read_sensor() {
  43. if((millis() - read_timer) >= 10000) { // 10sec pause
  44. /* Get Temperature */
  45. t1 = dht1.readTemperature();
  46. t2 = dht2.readTemperature();
  47. t3 = dht3.readTemperature();
  48. t4 = dht4.readTemperature();
  49. /* Get Humidity */
  50. h1 = dht1.readHumidity();
  51. h2 = dht2.readHumidity();
  52. h3 = dht3.readHumidity();
  53. h4 = dht4.readHumidity();
  54. /* Update Timer */
  55. read_timer = millis();
  56. }
  57. }
  58. /* #3 Send Data */
  59. void send_data(int mode, int sensor, float data) {
  60. switch (mode) {
  61. case 1: // Send Temperature
  62. sprintf(msg, "Temp #%d %g", sensor, data);
  63. Serial.println(msg);
  64. break;
  65. case 2: // Send Humidity
  66. sprintf(msg, "Humi #%d %g", sensor, data);
  67. Serial.println(msg);
  68. break;
  69. }
  70. }
  71. /* #4 Data analysis */
  72. void data_check() {
  73. if((millis() - check_timer) >= 60000) { // 1min (60sec) pause
  74. /* Анализ температуры */
  75. if((t1 - t1_his) > 1) {
  76. t1_his = t1; // Update history
  77. send_data(1, 1, t1); // Send data
  78. }
  79. if((t2 - t2_his) > 1) {
  80. t2_his = t2; // Update history
  81. send_data(1, 2, t2); // Send data
  82. }
  83. if((t3 - t3_his) > 1) {
  84. t3_his = t3; // Update history
  85. send_data(1, 3, t3); // Send data
  86. }
  87. if((t4 - t4_his) > 1) {
  88. t4_his = t4; // Update history
  89. send_data(1, 4, t4); // Send data
  90. }
  91. /* Анализ влажности */
  92. if((h1 - h1_his) > 1) {
  93. h1_his = h1; // Update history
  94. send_data(2, 1, h1); // Send data
  95. }
  96. if((h2 - h2_his) > 1) {
  97. h2_his = h2; // Update history
  98. send_data(2, 2, h2); // Send data
  99. }
  100. if((h3 - h3_his) > 1) {
  101. h3_his = h3; // Update history
  102. send_data(2, 3, h3); // Send data
  103. }
  104. if((h4 - h4_his) > 1) {
  105. h4_his = h4; // Update history
  106. send_data(2, 4, h4); // Send data
  107. }
  108. /* Update Timer */
  109. check_timer = millis();
  110. }
  111. }
  112.  
  113. String sendATCommand(String cmd, bool waiting) {
  114. String _resp = ""; // Переменная для хранения результата
  115. Serial.println(cmd); // Дублируем команду в монитор порта
  116. SIM800.println(cmd); // Отправляем команду модулю
  117. if (waiting) { // Если необходимо дождаться ответа...
  118. _resp = waitResponse(); // ... ждем, когда будет передан ответ
  119. // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
  120. if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
  121. _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
  122. }
  123. Serial.println(_resp); // Дублируем ответ в монитор порта
  124. }
  125. return _resp; // Возвращаем результат. Пусто, если проблема
  126. }
  127.  
  128. String waitResponse() { // Функция ожидания ответа и возврата полученного результата
  129. String _resp = ""; // Переменная для хранения результата
  130. long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
  131. while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  132. if (SIM800.available()) { // Если есть, что считывать...
  133. _resp = SIM800.readString(); // ... считываем и запоминаем
  134. }
  135. else { // Если пришел таймаут, то...
  136. Serial.println("Timeout..."); // ... оповещаем об этом и...
  137. }
  138. return _resp; // ... возвращаем результат. Пусто, если проблема
  139. }
  140.  
  141. void sendSMS(String phone, String message)
  142. {
  143. sendATCommand("AT+CMGS=\"" + phone + "\"", true); // Переходим в режим ввода текстового сообщения
  144. sendATCommand(message + "\r\n" + (String)((char)26), true); // После текста отправляем перенос строки и Ctrl+Z
  145. }
  146.  
  147. void sim800_process() {
  148. if (SIM800.available()) { // Если модем, что-то отправил...
  149. _response = waitResponse(); // Получаем ответ от модема для анализа
  150. _response.trim(); // Убираем лишние пробелы в начале и конце
  151. Serial.println(_response); // Если нужно выводим в монитор порта
  152. //....
  153. if (_response.startsWith("+CMGS:")) { // Пришло сообщение об отправке SMS
  154. int index = _response.lastIndexOf("\r\n");// Находим последний перенос строки, перед статусом
  155. String result = _response.substring(index + 2, _response.length()); // Получаем статус
  156. result.trim(); // Убираем пробельные символы в начале/конце
  157.  
  158. if (result == "OK") { // Если результат ОК - все нормально
  159. Serial.println ("Message was sent. OK");
  160. }
  161. else { // Если нет, нужно повторить отправку
  162. Serial.println ("Message was not sent. Error");
  163. }
  164. }
  165. }
  166. if (Serial.available()) { // Ожидаем команды по Serial...
  167. SIM800.write(Serial.read()); // ...и отправляем полученную команду модему
  168. };
  169. }
  170.  
  171. void serial_process() {
  172. if(Serial.available() > 0) {
  173. get_msg = Serial.read();
  174. }
  175. }
  176.  
  177. /* Setup Program */
  178. void setup() {
  179. wdt_disable();
  180. Serial.begin(9600);
  181. sensor_init(); // Setup Sensor`s
  182. wdt_enable(WDTO_8S);
  183. SIM800.begin(9600);
  184. sendATCommand("AT", true);
  185. }
  186.  
  187. void loop() {
  188. wdt_reset();
  189. read_sensor(); // Read Sensor`s
  190. data_check(); // Check change data
  191. sim800_process();
  192. serial_process();
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement