//Program: Pico_MQTT__Template.ino ///////////////////////////////////
//Programmer: P.Thounthong
//Update: 14/09/2024
#include <WiFi.h>
#include "PubSubClient.h"
//set variables for MultiTasking Template, here 10 tasks
uint32_t previousMillis_1;
uint32_t previousMillis_2;
uint32_t previousMillis_3;
uint32_t previousMillis_4;
uint32_t previousMillis_5;
uint32_t previousMillis_6;
uint32_t previousMillis_7;
uint32_t previousMillis_8;
uint32_t previousMillis_9;
uint32_t previousMillis_10;
//here 1000 = 1 second
uint32_t task1Time = 1000;
uint32_t task2Time = 1000;
uint32_t task3Time = 1000;
uint32_t task4Time = 1000;
uint32_t task5Time = 10; //for subscribers
uint32_t task6Time = 10; //for SW1
uint32_t task7Time = 10; //for SW1
uint32_t task8Time = 1000;
uint32_t task9Time = 1000;
uint32_t task10Time = 7900; //for WDT 7900 < 8000 see line 193
uint32_t currentTime;
//END set variables for Pico_MultiTasking_Template
// WiFi
//char ssid[]="TP-Link_BB4E";
//char pass[]="91945839";
char ssid[]="Wokwi-GUEST";
char pass[]="";
// MQTT Broker
const char *mqtt_broker = "cougar.rmq.cloudamqp.com";//"broker.emqx.io";//Public Broker
const char *mqtt_username = "zikyolij:zikyolij";
const char *mqtt_password = "5DXryw4yJVfJmTyM02MKMjiMqFDCJH78";
const int mqtt_port = 1883;
// App Protcol ---> Port
const char *topic_publish1 = "pub1";
const char *topic_publish2 = "pub2";
const char *topic_publish3 = "pub3";
const char *topic_publish4 = "pub4";
const char *topic_publish5 = "pub5";
const char *topic_publish6 = "pub6";
const char *topic_publish7 = "pub7";
const char *topic_publish8 = "pub8";
const char *topic_publish9 = "pub9";
const char *topic_publish10 = "pub10";
const char *topic_subsrcibe1 = "sub1";
const char *topic_subsrcibe2 = "sub2";
const char *topic_subsrcibe3 = "sub3";
const char *topic_subsrcibe4 = "sub4";
const char *topic_subsrcibe5 = "sub5";
WiFiClient hamada;//WIFI Opject
PubSubClient client(hamada);//OOP
//int y ;
//void function(int x);
//call_function(y);
void callback(char *topic, byte *payload, unsigned int length);
//define GPIO here
uint8_t LED1=4;
uint8_t LED2=3;
bool flag_1;
uint16_t simulationSensor; //for simulation sensor
//Set Timer PWM
uint32_t freq = 500; //100...1MHz
int resolution = 16; //1…16, n =16, 2^n = 65,536
int dutyCycle0;
int Temp;
//END Set Timer PWM
bool ledState=false;
void setup(){
Serial1.begin(115200); //Set software serial baud to 115200
//set GPIO here
pinMode(LED1, OUTPUT);
digitalWrite(LED1, LOW); // Turn off the LED initially
pinMode(LED2, OUTPUT);
digitalWrite(LED2, LOW); // Turn off the LED initially
//initial Timer PWM
analogWriteFreq(freq);
analogWriteResolution(resolution);
//END initial Timer PWM
// Connecting to a Wi-Fi network
WiFi.begin(ssid, pass);
Serial1.println("Connecting to WiFi..");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial1.print(".");
}
Serial1.println("Connected to the Wi-Fi network");
// Utilize PubSubClient to establish a connection with the MQTT broker.
//connecting to a mqtt broker
Serial1.println("Before Connect MQTT");
//Broker Configuration
client.setServer(mqtt_broker, mqtt_port);
while (!client.connected()) {
String client_id = "Pico-client-";
client_id =client_id + String(WiFi.macAddress());
//consloe.log("x"+"y");//xy
//ESP32-ID -----> esp32-client-macaddress
//variable.c_str()--->char [] , String
Serial1.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial1.println("Public MQTT broker connected");
} else {
Serial1.print("failed with state ");
Serial1.print(client.state());//1 , 2 , 5
delay(2000);
}
}
Serial1.println("After Connect MQTT");
//client.publish(topic_publish1, "Hi, I'm ESP32 ^^");
client.subscribe(topic_subsrcibe1);
client.subscribe(topic_subsrcibe2);
client.subscribe(topic_subsrcibe3);
client.subscribe(topic_subsrcibe4);
client.subscribe(topic_subsrcibe5);
client.setCallback(callback);
}
void loop() {
currentTime = millis(); //read current time for Multi-Tasks
//Task1
if (currentTime - previousMillis_1 >= task1Time) {
previousMillis_1 = currentTime;
if(flag_1) {
client.publish(topic_publish1, "1");
}
else{
client.publish(topic_publish1, "0");
}
flag_1 = !flag_1;
}
//Task2 Check for MQTT connection
if (currentTime - previousMillis_2 >= task2Time) {
previousMillis_2 = currentTime;
simulationSensor = random(0, 500); //Simulation Current sensor
client.publish(topic_publish2,String(simulationSensor).c_str(),true);
}
//Task3 for XX_pub1
if (currentTime - previousMillis_3 >= task3Time) {
previousMillis_3 = currentTime;
//if(flag_1) {
// mqttClient.publish("XX_pub1","1");
// //publish format mqttClient.publish("Topic","Message"); ๔
//}
//else{
// mqttClient.publish("XX_pub1","0");
//}
//flag_1 = !flag_1;
}
//Task4 for XX_pub2
if (currentTime - previousMillis_4 >= task4Time) {
previousMillis_4 = currentTime;
//simulationSensor = random(0, 500); //Simulation Current sensor
//mqttClient.publish("XX_pub2",String(simulationSensor).c_str(),true);
}
//Task5 check for subscribe message coming!
if (currentTime - previousMillis_5 >= task5Time) {
previousMillis_5 = currentTime;
client.loop();
//mqttClient.loop();
}
//Task6 read SW1
if (currentTime - previousMillis_6 >= task6Time) {
previousMillis_6 = currentTime;
//flag_SW1 = digitalRead(SW1);
}
//Task7 publish SW1 => XX_pub4%
if (currentTime - previousMillis_7 >= task7Time) {
previousMillis_7 = currentTime;
//if(lastflag_SW1 != flag_SW1){
// if(flag_SW1){
// mqttClient.publish("XX_pub4","0"); //ปล่อย SW1
// }
// else {
// mqttClient.publish("XX_pub4","1"); //กด SW1
// }
// lastflag_SW1 = flag_SW1;
//}
}
//Task8 here
if (currentTime - previousMillis_8 >= task8Time) {
previousMillis_8 = currentTime;
// vQ0 = analogRead(A0); //A0 @GPIO26, A1, A2
// vA0 = vQ0*200/4096; //200 A
// mqttClient.publish("XX_pub3",String(vA0).c_str(),true);
// lcd.setCursor(0, 1);
// lcd.print("i(A) = ");
// lcd.setCursor(7, 1);
// lcd.print(" ");
// lcd.setCursor(7, 1);
// lcd.print(vA0,2);
}
//Task9 here
if (currentTime - previousMillis_9 >= task9Time) {
previousMillis_9 = currentTime;
//work1
//work2
}
//Task10 here reset WDT is option!!!
if (currentTime - previousMillis_10 >= task10Time) {
previousMillis_10 = currentTime;
//rp2040.wdt_reset();
}
}
void callback(char* topic, byte* message, unsigned int length) {
// Printing Received Message
String messageTemp;
Serial1.print(topic);
Serial1.print(":");
for(int i=0; i<length; i+=1) {
messageTemp += (char)message[i];
}
Serial1.println(messageTemp);
//Task11: sub1
if(String(topic) == "sub1"){
if(messageTemp=="1"){
digitalWrite(LED1,HIGH);
}
if(messageTemp=="0"){
digitalWrite(LED1,LOW);
}
}
//Task 12
if(String(topic) == "sub2"){
Temp = messageTemp.toInt(); //converts String to Int
Temp = map(Temp,0,100,0,65535); //convert % to 16 bits
analogWrite(LED2, Temp);
}
}