Sebenarnya tujuan menulis di part 2 ini adalah jembatan untuk praktek akhir menampilkan grafik suhu dan kelembaban yang akan ditampilkan pada telegram bot. Untuk itu akan dibahas terlebih dahulu cara menyimpan data pembacaan sensor DHT11 pada database. Secara singkat jalan ceritanya seperti berikut: pembacaan sensor DHT11 akan dikirimkan oleh wemos/esp8266 secara MQTT PUB ke broker, sedangkan PC saya yg terinstal SQL Lite dan python sebagai bahasa pemrogramannya yg akan satu persatu menyisipkan data ke tabel dbase saat ada pesan SUB dari broker MQTT.
Langkah pertama adalah dengan melakukan instalasi SQLite pada website : https://www.sqlite.org/download.html , pilih yg sesuai dengan environtmet pc yg kamu gunakan lalu buatlah tabel dengan nama dht11 seperti gambar dibawah ini :
Jadi kita akan menyimpan pembacaan suhu dan kelembaban, ditambahkan juga kolom date yg merupakan waktu dari data sensor diterima. Pengiriman data ini dilakukan melalui MQTT, jadi sebelumnya harap dipahami praktek sebelumya disini : https://www.aisi555.com/2021/08/wemos-esp-8266-part-5-mqtt-ke-aplikasi.html , namun data yang kita kirim disini berupa JSON teks dengan format seperti berikut :
'{"suhu":"30.00" , "humi":"89.0"}'
Untuk script Arduino-Esp8266-MQTT Publish data ke broker hivemq seperti berikut ini :
#include <ESP8266WiFi.h>
#include <PubSubClient.h> //library pubsub by o'leary
#include "DHT.h"
const char *ssid = "Nama wifi"; // Gunakan sesuai wifi kamu
const char *pass = "password"; //
//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama
// Daftar Topik disingkat, karena biasanya panjang-panjang namanya
#define TOPIC "/aisi555/dht"
//IO pin
const int dhtPin = 13; //pin DHT di wemos
#define DHTTYPE DHT11 //Sensor DHT11
DHT dht(dhtPin, DHTTYPE);
//Timer
unsigned long previousMillis = 0;
const long interval = 5000; // interval pengambilan dht 11
WiFiClient wclient; //wifi client terhubung lib pubsub
PubSubClient client(wclient);
void setup() {
//Inisialisasi broker & Callback sub message
client.setServer(mqtt_server, mqtt_port);
Serial.begin(9600);
delay(10);
Serial.println();
Serial.println();
setupwifi();
dht.begin();
}
void setupwifi()
{
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Terhubung Ke Wifi: ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi Terhubung");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
void reconnectmqtt() //function mengatur koneksi ke broker
{
Serial.println("Connecting to MQTT server..");
if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
Serial.println("Connected to MQTT server");
} else {
Serial.println("Could not connect to MQTT server");
}
}
// Non-Blocking delay agar gak ganggu proses utama
void SendTempHumid(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
// cek interval
previousMillis = currentMillis;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" °C ");
String jsondht="{\"suhu\" : \""+String(t)+"\" , \"humi\" : \""+String(h)+" \" } ";
//yg dibawah ini metode pengiriman PUB ke TOPIC
//dikirim perbyte message + header nya
//sudah dimudahkan oleh library pubsub
Serial.println("publish to topic: " );
Serial.print(TOPIC);
Serial.print(" : ");
Serial.println(jsondht);
char message_buff[jsondht.length() + 1];
jsondht.toCharArray(message_buff, jsondht.length() + 1);
client.publish(TOPIC,message_buff );
}
}
void loop() {
if (!client.connected())
{
reconnectmqtt();
}
else client.loop(); //cek terus kalau ada data masuk
SendTempHumid();
}
Script diatas sudah sering saya bahas, jadi bila belum paham agar membaca dulu disini. Selanjutnya script untuk memasukkan nilai suhu (desimal) dan kelembaban (integer) ke dalam sqlite seperti dibawah ini, dan pastikan tabel database kamu type datanya sudah sesuai.
from paho.mqtt import client as mqtt_client
import random, json, sqlite3, datetime, time
# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic
# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''
def sql_insert(s,h):
db = sqlite3.connect("blog_aisi555.db") #sesuaikan nama DB
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()
# koneksi
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
# subscribe ke mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
from paho.mqtt import client as mqtt_client
import random, json, sqlite3, datetime, time
# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic
# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''
def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message
data= json.loads(msg.payload.decode())
suhu = float(data["suhu"])
humi = float(data["humi"])
sql_insert(suhu,humi)
def sql_insert(s,h):
db = sqlite3.connect("blog_aisi555.db")
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()