SMS-управляемое чтение температуры DHT22 на Arduino Mega 2560
Компоненты и материалы
| Arduino Mega 2560 | 1 |
| Датчик температуры/влажности DHT22 | 1 |
| SIM800L (GSM-модуль) | 1 |
| Резистор 10 кОм | 1 |
| Макетная плата | 1 |
| Перемычки | 1 набор |
О проекте
Привет. Этот проект — часть гораздо большего. У меня было много проблем с этой частью, но в итоге нашел решение и решил поделиться, надеясь помочь другим.
Описание проекта
Отправляем SMS на Arduino и получаем температуру дома.
Софт
Для SIM800L использовал библиотеку Seeeduino_GPRS-master. Пришлось изменить в sim800.h следующие строки для работы на Mega:
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 7
на TX_PIN 10 и RX_PIN 11. Переписать библиотеку с SoftwareSerial на один из аппаратных Serial портов Mega (Serial3) было слишком сложно, поэтому пошел простым путем.
Проблема
Мой код — копипаст из примеров двух библиотек: DHT.h и Seeeduino_GPRS-master. Проблема: пример gprs.h показывал только отправку заранее заданного сообщения в кавычках. Не мог разобраться, как отправить переменную float от датчика температуры. То же с другими библиотеками: GPRS_SIM900-master и SIM800L-master.
Недели искал в вебе примеры — нигде. Нашел форумные посты с той же проблемой, но без ответов. Надеюсь, те потерянные души найдут этот пост.
Решение
Преобразовать float в String, затем String в char array — просто!
Фрагмент кода решения
MyString = String(temp, 0); // float в String
MyString = (MyString + " Degrees C");
// String в char array:
int str_len = MyString.length() + 1;
char char_array[str_len];
MyString.toCharArray(char_array, str_len);
gprs.sendSMS("04++++++++", char_array); // номер телефона и текст
Подключение
Питание SIM-модуля от ULTRAFIRE 18650. Позже добавлю стабилизатор напряжения. См. этот урок.
Ссылочный материал
Библиотеки
Код
DHT_SIMPosting.ino (Arduino)
// Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); #include#include #define TIMEOUT 5000 GPRS gprs; bool ITemp = false; float temp; String MyString; #define LED_PIN 13 bool ledStatus; char currentLine[500] = ""; int currentLineIndex = 0; bool nextLineIsMessage = false; void Reply() { Serial.println("GPRS - Send SMS Test ..."); gprs.preInit(); delay(1000); while(0 != gprs.init()) { delay(1000); Serial.print("init error\r\n"); } Serial.println("Init success, start to send SMS message..."); if (ITemp == true) { float t = dht.readTemperature(); temp = t; ITemp = false; } MyString = String(temp, 0); MyString = (MyString + " Degrees C"); int str_len = MyString.length() + 1; char char_array[str_len]; MyString.toCharArray(char_array, str_len); gprs.sendSMS("04++++++++", char_array); } void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); gprs.preInit(); delay(1000); while(0 != gprs.init()) { delay(1000); Serial.print("init error\r\n"); } // SMS режим ASCII if(0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) { ERROR("ERROR:CNMI"); return; } // Слушание новых SMS if(0 != gprs.sendCmdAndWaitForResp("AT+CNMI=1,2,0,0,0\r\n", "OK", TIMEOUT)) { ERROR("ERROR:CNMI"); return; } Serial.println("Init success"); } void loop() { delay(2000); float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.println(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); SIM(); } void SIM() { digitalWrite(LED_PIN, ledStatus); Serial.println("Looking for SMS"); if(gprs.serialSIM800.available()) { char lastCharRead = gprs.serialSIM800.read(); if(lastCharRead == '\r' || lastCharRead == '\n') { String lastLine = String(currentLine); if(lastLine.startsWith("+CMT:")) { Serial.println(lastLine); nextLineIsMessage = true; } else if (lastLine.length() > 0) { if(nextLineIsMessage) { Serial.println(lastLine); if(lastLine.indexOf("InTemp") >= 0) { Serial.println("InTemp"); ITemp = true; Reply(); } // else if(lastLine.indexOf("LED OFF") >= 0) { ... } nextLineIsMessage = false; } } for(int i = 0; i < sizeof(currentLine); ++i) currentLine[i] = (char)0; currentLineIndex = 0; } else { currentLine[currentLineIndex++] = lastCharRead; } } }
Схемы
Производственный процесс
- Температурно-управляемый вентилятор: DIY релейная система охлаждения мебели для медиа
- Сборка логгера температуры на Raspberry Pi с $5 I2C датчиком
- Как считывать температуру с DS18B20 на Raspberry Pi 2
- Профессиональный мониторинг температуры на Raspberry Pi с датчиком DS18B20
- Измерение температуры на Raspberry Pi с датчиками Maxim 1-Wire и мостом DS2482 I2C
- Точный мониторинг температуры в серверной на Raspberry Pi
- Учебник для начинающих по IoT: стриминг данных температуры с Raspberry Pi
- Создание сетевой лабораторной метеостанции на Raspberry Pi
- Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
- Построение ровера на Windows IoT Core с Raspberry Pi 2 — Руководство от новичка к профи