SMS-Gestuurde DHT22 Temperatuur Uitlezing met Arduino Mega 2560
Onderdelen en benodigdheden
| Arduino Mega 2560 | 1 |
| DHT22 Temperatuursensor | 1 |
| SIM800L (GSM/GPRS module) | 1 |
| Weerstand 10k ohm | 1 |
| Breadboard (generiek) | 1 |
| Draadjes (generiek) | 1 set |
Over dit project
Hallo. Dit project is onderdeel van een veel groter project. Omdat ik veel problemen had met dit deel en uiteindelijk een oplossing vond, besloot ik het met de community te delen in de hoop dat het hen helpt.
Projectbeschrijving
Stuur een SMS naar de Arduino en ontvang de temperatuur thuis.
Software
Voor de SIM800L module gebruikte ik de "Seeeduino_GPRS-master" library. Ik moest de volgende regels in "sim800.h" wijzigen om het op een MEGA werkend te krijgen:
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 7
...naar TX_PIN 10 en RX_PIN 11. Het wijzigen van de library van "SoftwareSerial" naar een van de Mega seriële poorten (bijv. Serial3) was te lastig, dus ik koos voor de makkelijke weg.
Het Probleem
Mijn code is eigenlijk knip-en-plak voorbeelden uit twee libraries: "DHT.h" en "Seeeduino_GPRS-master". Het probleem was dat het "gprs.h" voorbeeld alleen liet zien hoe je een vooraf bepaald bericht in aanhalingstekens stuurt. Ik kon niet uitvinden hoe ik de variabele float waarde van mijn temperatuursensor kon sturen. Hetzelfde geldde voor andere libraries die ik probeerde: "GPRS_SIM900-master" en "SIM800L-master".
Ik had wekenlang het web afgestroopt naar voorbeelden die mijn probleem oplosten en vond er geen. Ik vond forum posts over hetzelfde onderwerp, en voor die arme zielen die geen antwoorden kregen, hoop ik dat ze deze posting vinden.
De Oplossing
Converteer de float waarde naar een String en dan de String naar een Char Array – simpel!
Code Fragment
MyString = String(temp, 0); // Converteer float naar String
MyString = (MyString + " Grad Celsius"); // Voeg eenheid toe
// Converteer string naar char array
int str_len = MyString.length() + 1; // Lengte + null terminator
char char_array[str_len]; // Buffer aanmaken
MyString.toCharArray(char_array, str_len); // Kopiëren
gprs.sendSMS("04++++++++", char_array); // Telefoonnummer en tekst
Bedrading
Ik gebruikte een ULTRAFIRE 18650 batterij voor de stroomvoorziening van de SIM module. Later zal ik een spanningsregelaar toevoegen. Zie deze tutorial.
Referentiemateriaal
Libraries
Code
DHT_SIMPosting.ino (Arduino)
// Voorbeeld test sketch voor diverse DHT humidity/temperatuur sensoren
// Geschreven door ladyada, public domain
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
#include <gprs.h>
#include <softwareserial.h>
#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 + " Grad Celsius");
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 naar ASCII
if(0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) {
ERROR("ERROR:CNMI");
return;
}
// Luisteren naar nieuwe SMS berichten
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("Vochtigheid: ");
Serial.print(h);
Serial.println(" %\t");
Serial.print("Temperatuur: ");
Serial.print(t);
Serial.println(" *C ");
SIM();
}
void SIM() {
digitalWrite(LED_PIN, ledStatus);
Serial.println("Zoeken naar 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();
}
// Extra commando's mogelijk:
// else if(lastLine.indexOf("LED OFF") >= 0) { ... }
nextLineIsMessage = false;
}
}
// Clear char array
for(int i = 0; i < sizeof(currentLine); ++i) {
currentLine[i] = (char)0;
}
currentLineIndex = 0;
} else {
currentLine[currentLineIndex++] = lastCharRead;
}
}
}
Schema's
Productieproces
- Temperatuur-gecontroleerde Ventilator: DIY Relais Systeem Voor Media Kast Koeling
- Bouw Een Raspberry Pi Temperatuur Logger Met Een $5 I2C Sensor
- Hoe Temperatuur Te Lezen Met Een DS18B20 Op Raspberry Pi 2
- Professionele temperatuurbewaking met Raspberry Pi en DS18B20
- Temperatuurmeting op Raspberry Pi met Maxim 1-Wire sensoren en DS2482 I2C-brug
- Accurate temperatuurbewaking in een serverkast met Raspberry Pi
- Beginner IoT-tutorial: Temperatuurdata streamen vanaf een Raspberry Pi
- Een Netwerk-ingeschakelde Laboratorium Weerstation Bouwen met Raspberry Pi
- Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
- Bouw een Windows IoT Core Rover met Raspberry Pi 2 – Beginner tot Gevorderde Gids
- AuGe12: Premium Op Goud Gebaseerde Zachte Soldeerlegering