SMS-gesteuerte DHT22-Temperaturabfrage mit Arduino Mega 2560
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino Mega 2560 | 1 |
| DHT22 Temperatursensor | 1 |
| SIM800L GSM-Modul | 1 |
| Widerstand 10 kΩ | 1 |
| Steckbrett | 1 |
| Jumper-Kabel | 1 Set |
Über dieses Projekt
Dieses Projekt ist Teil eines größeren Vorhabens. Da ich viele Probleme hatte und schließlich eine Lösung fand, teile ich sie, um anderen zu helfen.
Projektbeschreibung: SMS an Arduino senden → Temperatur zu Hause per SMS zurückerhalten.
Software
Für SIM800L: Bibliothek „Seeeduino_GPRS-master“. Änderungen in sim800.h für Mega-Kompatibilität nötig:
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 7
→ auf TX_PIN 10 und RX_PIN 11 ändern (Hardware-Serial3 wäre aufwendiger, daher SoftwareSerial-Beibehaltung).
Das Problem: Code aus „DHT.h“ und „Seeeduino_GPRS-master“ kombiniert. Die GPRS-Beispiele zeigen nur vordefinierte Nachrichten in Anführungszeichen. Wie die float-Variable des Temperatursensors als SMS senden? Gleiches Problem bei „GPRS_SIM900-master“ und „SIM800L-master“. Wochenlanges Suchen brachte keine Lösung.
Die Lösung: float → String → Char-Array – ganz einfach!
Code-Schnipsel: Float zu SMS
MyString = String(temp, 0); // Float zu String (0 Nachkommastellen)
MyString = (MyString + " Degrees C"); // Einheit anhängen
// String zu Char-Array
int str_len = MyString.length() + 1;
char char_array[str_len];
MyString.toCharArray(char_array, str_len);
gprs.sendSMS("04++++++++", char_array); // Telefonnummer & Text
Verdrahtung
SIM800L-Stromversorgung: ULTRAFIRE 18650-Akku. Später Spannungsregler nachrüsten. Siehe Tutorial.
Referenzmaterial
Bibliotheken
Code
DHT_SIMPosting.ino – Vollständiger Sketch
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
// DHT22 Anschluss:
// Pin 1 (links) → +5V
// Pin 2 → DHTPIN (Digital 2)
// Pin 4 (rechts) → GND
// 10K Widerstand Pin 2 → Pin 1
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-Modus ASCII
if (0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) {
ERROR("ERROR:CNMI"); return;
}
// Neue SMS Benachrichtigungen
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;
}
}
// Buffer leeren
for (int i = 0; i < sizeof(currentLine); ++i) currentLine[i] = 0;
currentLineIndex = 0;
} else {
currentLine[currentLineIndex++] = lastCharRead;
}
}
}
Schaltplan
Herstellungsprozess
- Temperaturgesteuerter Lüfter: DIY Relais-System für Medienmöbel-Kühlung
- Raspberry Pi Temperaturlogger mit 5 $ I2C Sensor bauen
- Temperatur mit DS18B20 am Raspberry Pi 2 auslesen
- Professionelle Temperaturüberwachung mit Raspberry Pi und DS18B20
- Temperaturmessung mit Maxim 1-Wire Sensoren und DS2482 I2C-Bridge am Raspberry Pi
- Präzise Temperaturüberwachung im Server-Schrank mit Raspberry Pi
- Einsteiger IoT Tutorial: Temperaturdaten vom Raspberry Pi streamen
- Netzwerkfähige Labor-Wetterstation mit Raspberry Pi bauen
- Raspberry Pi Heimtemperaturmonitor mit MCP9808, InfluxDB & Grafana bauen
- Windows IoT Core Rover mit Raspberry Pi 2 bauen – Anfänger bis Fortgeschritten