hi i'm new to arduino and i have some problem adding MQTT connection from our (me and friends) arduino code.
#include <Arduino.h>
#include <math.h>
#include <Wire.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
#include "MAX30100_PulseOximeter.h"
#include <LiquidCrystal_I2C.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ThingSpeak.h>
#define REPORTING_PERIOD_MS 1000
LiquidCrystal_I2C lcd(0x27, 16,2);
PulseOximeter pox;
uint32_t tsLastReport = 0;
float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D4;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;
const char* mqtt_server = "192.168.1.5";
const int mqtt_port = 1883;
const char* mqtt_user = "user";
const char* mqtt_pass = "123456";
WiFiClient espClient;
PubSubClient mqttClient(espClient);
void onBeatDetected() {
Serial.println("Beat!");
}
char ssid[ ] = ".....";
char pass[ ] = ".....";//password wifi
const char* server = "....";
const char* resource = ".....";
String apiKey = "....";
WiFiClientSecure clientTele;
WiFiClient client;
UniversalTelegramBot bot(".....", clientTele); // Token BOT TELEGRAM
const char* CHAT_ID = "....."; // ID obrolan untuk BOT TELEGRAM
void connectWiFi() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Menghubungkan ke");
lcd.setCursor(0, 1);
lcd.print("WiFi...");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000)
{
delay(500);
}
if (WiFi.status() == WL_CONNECTED)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Terhubung");
Serial.println("WiFi Terhubung");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
}
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gagal Terhubung WiFi");
Serial.println("Gagal Terhubung WiFi");
}
}
void connectMQTT(){
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT broker...");
Serial.print("Broker IP: ");
Serial.println(mqtt_server);
Serial.print("Broker Port: ");
Serial.println(mqtt_port);
// Attempt to connect to the MQTT broker
if (mqttClient.connect("ESP8266Client", mqtt_user, mqtt_pass)) {
Serial.println("connected");
// Optionally subscribe to a topic if needed
// mqttClient.subscribe("your_topic");
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
lcd.clear();
lcd.begin();
lcd.backlight();
lcd.noCursor();
Serial.begin(9600);
Serial.println("Pulse oxymeter test!");
pinMode(motor,OUTPUT);
pinMode(solenoid,OUTPUT);
pinMode(tombol,INPUT_PULLUP);
connectWiFi();
mqttClient.setServer(mqtt_server, mqtt_port); // Set detail MQTT broker
connectMQTT();
delay(2000);
clientTele.setInsecure();
Serial.print("Initializing pulse oximeter..");
// Initialize sensor
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
// Configure sensor to use 7.6mA for LED drive
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback routine
pox.setOnBeatDetectedCallback(onBeatDetected);
lcd.setCursor(0,0);
lcd.print("BPM= ");
lcd.setCursor(0,1);
lcd.print("S= D= ");
}
void loop() {
dataadc = analogRead(A0);
mmhgx = (dataadc - 46.222) / 3.2;
lcd.setCursor(0,1);
lcd.print("S= ");
lcd.print(sistolex);
lcd.print(" D= ");
lcd.print(diastolex);
lcd.print(" ");
tombolx = digitalRead(tombol);
if(tombolx == LOW){
mark = 0;
lcd.clear();
delay(1000);
digitalWrite(motor,HIGH);
digitalWrite(solenoid,HIGH);
mulai();
}
pox.update();
// Grab the updated heart rate and SpO2 levels
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
bpm = pox.getHeartRate();
spo = pox.getSpO2();
lcd.setCursor(0,0);
lcd.print("B/S: ");
lcd.print(pox.getHeartRate());
lcd.print(" / ");
lcd.print(pox.getSpO2());
lcd.print(" ");
// Serial.print("Heart rate:");
// Serial.print(pox.getHeartRate());
// Serial.print("bpm / SpO2:");
// Serial.print(pox.getSpO2());
// Serial.println("%");
tsLastReport = millis();
}
mqttClient.loop();
delay(10);
}
void mulai(){
dataadc = analogRead(A0);
mmhg = (dataadc - 46.222) / 3.2;
if((mmhg >= mmhgx + 2)&&(mmhg > 142)&&(mark == 0)){
//digitalWrite(motor,LOW);
Serial.println("SISTOLE");
sistole = mmhg;
mark = 2;
digitalWrite(motor,LOW);
}
if((mmhg >= mmhgx + 2)&&(mmhg > 50)&&(mmhg < 105)&&(mark == 2)){
//digitalWrite(motor,LOW);
Serial.println("DIASTOLE");
diastole = mmhg;
mark = 3;
}
lcd.setCursor(0,1);
lcd.print("S= ");
lcd.print(mmhg);
lcd.print(" ");
if(mmhg >= 150)
{
digitalWrite(motor,LOW);
}
mmhgx = mmhg;
Serial.println(mmhg);
if((mark == 3)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = diastole;
digitalWrite(solenoid,LOW);
kirimtele();
kirimthings();
kirimmqtt();
Serial.print(" ");
return;
}
if((mark == 2)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = random(60,90);
digitalWrite(solenoid,LOW);
kirimtele();
kirimthings();
Serial.println("");
return;
}
delay(1);
mulai();
}
void kirimtele(){
bool success = false;
String pesanLCD = "";
if ((sistolex >= 90 )&&(sistolex <= 139)) {
Serial.println("TENSI NORMAL");
pesanLCD = "TENSI NORMAL";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(1500);
String tensi = " tensi sekarang : ";
tensi += float(sistolex);
tensi += " / ";
tensi += float(diastolex);
tensi += " \n";
tensi += "TENSI NORMAL!\n";
success = bot.sendMessage(CHAT_ID, tensi, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if ((sistolex >= 140 )&&(sistolex <= 170)) {
Serial.println("TENSI TINGGI");
pesanLCD = "TENSI TINGGI";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String tensi = " tensi sekarang : ";
tensi += float(sistolex);
tensi += " / ";
tensi += float(diastolex);
tensi += " \n";
tensi += "TENSI TINGGI!\n";
success = bot.sendMessage(CHAT_ID, tensi, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if ((sistolex >= 50 )&&(sistolex <= 90)) {
Serial.println("TENSI RENDAH");
pesanLCD = "TENSI RENDAH";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String tensi = " tensi sekarang : ";
tensi += float(sistolex);
tensi += " / ";
tensi += float(diastolex);
tensi += " \n";
tensi += "TENSI RENDAH!\n";
success = bot.sendMessage(CHAT_ID, tensi, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if ((bpm >= 50 )&&(bpm <= 100)) {
Serial.println("BPM NORMAL");
pesanLCD = "BPM NORMAL";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String bpmnya = " BPM sekarang : ";
bpmnya += float(bpm);
bpmnya += " \n";
bpmnya += "BPM NORMAL!\n";
success = bot.sendMessage(CHAT_ID, bpmnya, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if ((bpm >= 100 )&&(bpm <= 200)) {
Serial.println("BPM CEPAT");
pesanLCD = "BPM CEPAT";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String bpmnya = " BPM sekarang : ";
bpmnya += float(bpm);
bpmnya += " \n";
bpmnya += "BPM CEPAT!\n";
success = bot.sendMessage(CHAT_ID, bpmnya, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if ((bpm >= 10 )&&(bpm <= 90)) {
Serial.println("BPM LAMBAT");
pesanLCD = "BPM LAMBAT";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String bpmnya = " BPM sekarang : ";
bpmnya += float(bpm);
bpmnya += " \n";
bpmnya += "BPM LAMBAT!\n";
success = bot.sendMessage(CHAT_ID, bpmnya, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if (spo >= 95 ) {
Serial.println("Saturasi NORMAL");
pesanLCD = "SPO NORMAL";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String sponya = " SPO sekarang : ";
sponya += float(spo);
sponya += " \n";
sponya += "Saturasi NORMAL!\n";
success = bot.sendMessage(CHAT_ID, sponya, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
if (spo < 95 ) {
Serial.println("Saturasi RENDAH");
pesanLCD = "SPO RENDAH";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesanLCD);
delay(2000);
String sponya = " SPO sekarang : ";
sponya += float(spo);
sponya += " \n";
sponya += "Saturasi RENDAH!\n";
success = bot.sendMessage(CHAT_ID, sponya, "");
Serial.print("Mengirim data sensor ke telegram");
Serial.println(" ");
}
// Menampilkan pesan keberhasilan di LCD
lcd.clear();
lcd.setCursor(0,0);
if (success) {
lcd.print("Data Berhasil");
lcd.setCursor(0,1);
lcd.print("Ke Telegram");
} else {
lcd.print("Gagal Kirim");
lcd.setCursor(0,1);
lcd.print("Ke Telegram");
}
delay(2000); // Biarkan pesan di layar selama 2 detik
lcd.clear(); // Hapus pesan dari layar
}
void kirimthings() {
bool success = false; // Variabel untuk mengecek apakah pengiriman berhasil
if (client.connect(server, 80)) {
// String data yang akan dikirim
String postStr = "field1=" + String(bpm) + "&field2=" + String(spo) + "&field3=" + String(sistolex) + "&field4=" + String(diastolex);
Serial.print("Sending data: ");
Serial.println(postStr);
// Kirim HTTP request ke ThingSpeak
client.print(String("POST ") + resource + apiKey + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: " + postStr.length() + "\r\n\r\n" +
postStr);
Serial.println(". Data sent to ThingSpeak.");
success = true; // Set success menjadi true jika koneksi dan pengiriman berhasil
} else {
Serial.println("Failed to connect to ThingSpeak.");
}
client.stop();
// Menampilkan pesan di LCD
lcd.clear();
lcd.setCursor(0, 0);
if (success) {
lcd.print("Data Berhasil");
lcd.setCursor(0, 1);
lcd.print("Ke ThingSpeak");
} else {
lcd.print("Gagal Kirim");
lcd.setCursor(0, 1);
lcd.print("Ke ThingSpeak");
}
delay(2000); // Tampilkan pesan di layar selama 2 detik
lcd.clear(); // Hapus pesan dari layar setelahnya
Serial.println("Waiting...");
}
void kirimmqtt() {
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT broker at ");
Serial.print(mqtt_server);
Serial.print(":");
Serial.println(mqtt_port);
// Attempt to connect
if (mqttClient.connect("ESP8266Client", mqtt_user, mqtt_pass)) {
Serial.println("connected");
// Prepare data strings to publish
String systolicMsg = String(sistolex); // Systolic value
String diastolicMsg = String(diastolex); // Diastolic value
String bpmMsg = String(bpm); // Heart rate (BPM)
String spo2Msg = String(spo); // Oxygen saturation (SpO2)
// Publish data to corresponding MQTT topics
mqttClient.publish("healthmonitor/systolic", systolicMsg.c_str());
mqttClient.publish("healthmonitor/diastolic", diastolicMsg.c_str());
mqttClient.publish("healthmonitor/bpm", bpmMsg.c_str());
mqttClient.publish("healthmonitor/spo2", spo2Msg.c_str());
Serial.println("Data sent to MQTT broker.");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Data Berhasil");
lcd.setCursor(0,1);
lcd.print("Ke Broker MQTT");
delay (3500);
lcd.clear();
} else {
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Send Failed");
lcd.setCursor(0, 1);
lcd.print("Retrying...");
delay(5000);
}
}
}
so this code is using Lolin (wemos) D1 R2 & mini as a board. i compile it and upload it. it succeed but the serial monitor or device end up looping with this message.
connecting to MQTT broker...failed, rc=-2 try again in 5 seconds
so this is the parts i didnt understand:
1.went the device (192.168.1.xxx) connected with my laptop (192.168.1.5) i can ping them fine using cmd and it had an activity that those 2 ips is connected.
2. i tried check my MQTT broker using mqqtx and mqtt explorer. the broker can connect and communicate just fine.
3. but went i checked the mosquito log there's no log about the device try to connect to broker.
p.s :
- i already tried the code without mqtt stuff, the device work as intended.
- english is my 3rd language.