Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <DHT.h>
- #include <avr/wdt.h>
- #include <SoftwareSerial.h>
- /* 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(8, 9);
- /* 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) >= 10000) { // 10sec 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()); // ...и отправляем полученную команду модему
- };
- }
- void serial_process() {
- if(Serial.available() > 0) {
- get_msg = Serial.read();
- }
- }
- /* Setup Program */
- void setup() {
- wdt_disable();
- Serial.begin(9600);
- sensor_init(); // Setup Sensor`s
- wdt_enable(WDTO_8S);
- SIM800.begin(9600);
- sendATCommand("AT", true);
- }
- void loop() {
- wdt_reset();
- read_sensor(); // Read Sensor`s
- data_check(); // Check change data
- sim800_process();
- serial_process();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement