//Program: Pico_MQTT__Template.ino ///////////////////////////////////
//Programmer: P.Thounthong
//Update: 14/09/2024
//include your libraries here
#include <WiFi.h>
#include "PubSubClient.h"
//#include <Wire.h> //I2C library
//#include <LiquidCrystal_I2C.h>
//end libraries here
//set variables for MultiTasking Template, here 10 tasks
uint32_t previousMillis_1; //for Wifi connection
uint32_t previousMillis_2; //for MQTT connection
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 = 7000; //for Wifi connection
uint32_t task2Time = 7000; //for MQTT connection
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
//Update these with values suitable for your network.
#define wifi_ssid "wrn.way" //"TP-Link_BB4E" //"TangmoAP" //"iPhone"
#define wifi_password "11111111" //"91945839" // "0839857333" //"12345678"
//Config MQTT Server
#define mqtt_server "cougar.rmq.cloudamqp.com"
#define mqtt_user "zikyolij:zikyolij"
#define mqtt_password "5DXryw4yJVfJmTyM02MKMjiMqFDCJH78"
#define mqtt_port 1883
#define mqtt_ID "26_wrn.way" //As you want
//END Config MQTT Server
//SET GPIOn here
bool flag_1; //just for play XX_pub1
//uint8_t SW1 = 2; //SW1 at GPIO2
//bool flag_SW1;
//bool lastflag_SW1;
//uint8_t LED1 = 4; //for XX_sub1
//uint8_t LED2 = 3; //for XX_sub2
//End Set-up GPIOn here
//int simulationSensor; //For random current 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
//SET ADC
//float vQ0; //Q = Discrete value, Quantization number
//float vA0;
//int AnalogResolution = 12; //1...12
WiFiClient espClient; //Pico in Station/Client mode
PubSubClient mqttClient(espClient);
//LiquidCrystal_I2C lcd(0x27, 16, 2); //set LCD
void wifiSetup() {
Serial.println("....");
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.mode(WIFI_STA); //STA = Station Mode
WiFi.begin(wifi_ssid, wifi_password); //connected to WIFI
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//rp2040.wdt_reset();
}
void reconnect() {
// Loop until we're reconnected
while (!mqttClient.connect(mqtt_ID, mqtt_user, mqtt_password)) {
Serial.print("Attempting MQTT connection...");
Serial.print("failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
Serial.println("MQTT connected!");
mqttClient.subscribe("XX_sub1"); //Must declare here first!!
mqttClient.subscribe("XX_sub2");
mqttClient.subscribe("XX_sub3");
mqttClient.subscribe("XX_sub4");
mqttClient.subscribe("XX_sub5");
}
//Do for Subscribers here
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("My Topic is arrived!!!!");
Serial.println("Topic & Messege are : ");
Serial.print(topic);
Serial.print(": ");
String msg = "";
int i=0;
while (i<length) msg += (char)payload[i++];
//Do for Topic = XX_sub1 for digital
//Task 11
if(strcmp(topic,"XX_sub1")==0) {
Serial.println(msg);
if (msg == "1") {
digitalWrite(LED1, HIGH);
}
if (msg == "0") {
digitalWrite(LED1, LOW);
}
}
//Do for Topic = XX_sub2 for Analog 0...100
//Task 12
if(strcmp(topic,"XX_sub2")==0) {
//Serial.println(msg);
//Temp = msg.toInt(); //converts String to Int
//Temp = map(Temp,0,100,0,65535); //Timer set at 16 bits
//analogWrite(LED2, Temp);
}
//Do for Topic = XX_sub3
//Task 13
if(strcmp(topic,"XX_sub3")==0) {
//Serial.println(msg);
//Temp = msg.toInt(); //converts String to Int
//Temp = map(Temp,0,100,0,65535); //Timer set at 16 bits
//analogWrite(LED1, Temp);
}
//Do for Topic = XX_sub4
//Task 14
if(strcmp(topic,"XX_sub4")==0) {
}
//Do for Topic = XX_sub5
//Task 15
if(strcmp(topic,"XX_sub5")==0) {
}
}
void setup() {
Serial.begin(115200);
//Wire.setSDA(8);
//Wire.setSCL(9);
//Wire.begin();
//lcd.begin();
//lcd.setCursor(4, 0);
//lcd.print("AMP Meter");
//initial GPIOn here
//pinMode(SW1, INPUT_PULLUP);
pinMode(LED1, OUTPUT); //for sub1
//pinMode(LED2, OUTPUT); //for sub2
//End initial GPIOn
//initial Timer PWM
//analogWriteFreq(freq);
//analogWriteResolution(resolution);
//END initial Timer PWM
//analogReadResolution(AnalogResolution); //Analog
//rp2040.wdt_begin(8000); //Start WDT for 8 s, max = 8.3s
wifiSetup();
delay(1000); //Allow the hardware to sort itself out
mqttClient.setServer(mqtt_server, mqtt_port);
mqttClient.setCallback(callback); //set callback function
reconnect(); //Connect to Cloud MQTT
}
void loop(){
currentTime = millis(); //read current time for Multi-Tasks
//Task1 as check for Wifi connection
if (currentTime - previousMillis_1 >= task1Time) {
previousMillis_1 = currentTime;
if(WiFi.status() != WL_CONNECTED) {
wifiSetup();
}
Serial.println("Currently, WIFI connection is OK.");
}
//Task2 Check for MQTT connection
if (currentTime - previousMillis_2 >= task2Time) {
previousMillis_2 = currentTime;
if (!mqttClient.connect(mqtt_ID, mqtt_user, mqtt_password)) {
reconnect();
}
Serial.println("Currently, MQTT connection is OK.");
}
//Task3 for XX_pub1
if (currentTime - previousMillis_3 >= task3Time) {
previousMillis_3 = currentTime;
if(flag_1) {
mqttClient.publish("26_pub1","1");
//publish format mqttClient.publish("Topic","Message"); ๔
}
else{
mqttClient.publish("26_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;
mqttClient.loop();
}
//Task6 read SW1
if (currentTime - previousMillis_6 >= task6Time) {
previousMillis_6 = currentTime;
//flag_SW1 = digitalRead(SW1);
}
//Task7 publish SW1 => XX_pub3
if (currentTime - previousMillis_7 >= task7Time) {
previousMillis_7 = currentTime;
//if(lastflag_SW1 != flag_SW1){
// if(flag_SW1){
// mqttClient.publish("XX_pub3","0"); //ปล่อย SW1
// }
// else {
// mqttClient.publish("XX_pub3","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();
}
} //End program here //////////////////////////////////////////////////////Loading
pi-pico-w
pi-pico-w