#include <WiFi.h>
#include "PubSubClient.h"
int Accelerometer = 34;
int Buzzer = 4;
int BuzzerState = LOW;
unsigned long mqttMillis;
unsigned long analogMillis;
const char* ssid = "Wokwi-GUEST";
const char* brokerName = "broker.hivemq.com"; // MQTT server name
int PORTNUM = 1883; // MQTT port number to use
WiFiClient wifiClient; // client for WiFi
PubSubClient mqttClient(wifiClient); // client for MQTT
bool mqttConnOK = false;
const char* mqttClientName = "mqttClient_" "Project2";
const char* RotaryTopicPub = "IOT/PA31/rotary";
const char* BuzzerTopicPub = "IOT/PA31/Buzzerstatus";
const char* BuzzerTopicSub = "IOT/PA31/Buzzercontrol";
void connectToAP(const char* ssid) {
Serial.printf("\r\n------------"
"\r\nConnecting to AP ssid: %s ", ssid);
WiFi.begin(ssid, "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.printf("\nConnected to AP ssid: %s"
"\nIP given: "
, ssid);
Serial.print(WiFi.localIP()); //prints ip for local device
}
bool mqttConnect() {
Serial.printf("\n--- Connecting to MQTT Broker: %s."
"\nwith MQTT client name: %s",
brokerName, mqttClientName);
if (mqttClient.connect(mqttClientName) ) {
Serial.print("\nConnected to broker"); // MQTT connection OK
return true;
}
else {
Serial.print("\nConnection failed. State="); // MQTT connection fail
Serial.print(mqttClient.state() ); // failure info
return false;
}
}
void mqttSetupBrokerNCB() {
Serial.printf("\n--- Set broker name to %s at port num %d",
brokerName, PORTNUM);
mqttClient.setServer(brokerName, PORTNUM);
mqttClient.setCallback(mqttCallback);
}
void mqttCallback(String topic, byte* data, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)data[i]; // build String for processing
}
Serial.printf("\n--- Received topic: \"%s\" + payload \"%s\"", topic.c_str(), msg.c_str());
if (topic == BuzzerTopicSub)
{
if (msg == "S")
{
// digitalWrite(ledPin, HIGH);
noTone(Buzzer);
BuzzerState = LOW;
char buff[2] = "0"; // 1 char string: '0'+null
buff[0] = BuzzerState ? '1' : '0';
publishTopic(BuzzerTopicPub, buff);
}
else
{
// digitalWrite(ledG, HIGH);
}
}
}
void mqttSubscribe()
{
Serial.println("Subscribe to RotaryTopic");
mqttClient.subscribe(RotaryTopicPub);
Serial.println("Subscribe to BuzzerTopicPub");
mqttClient.subscribe(BuzzerTopicPub);
Serial.println("Subscribe to BuzzerTopicSub");
mqttClient.subscribe(BuzzerTopicSub);
}
bool publishTopic(const char* topic, const char *str) {
Serial.printf("\nPublishing topic \"%s\" + payload \"%s\"", topic, str);
if (mqttClient.publish(topic, str)) {
Serial.print(" -- Done");
return true;
}
else {
Serial.print("\nPublishing encounter error");
return false;
}
}
void toggleBuzzer(){
// digitalWrite(ledPin, !digitalRead(ledPin));
BuzzerState = !BuzzerState;
digitalWrite(Buzzer, BuzzerState);
char buf[2] = "0"; // 1 char string: '0'+null
buf[0] = BuzzerState ? '1' : '0';
publishTopic(BuzzerTopicPub, buf);
}
void setup() {
pinMode(Accelerometer, INPUT);
pinMode(Buzzer, OUTPUT);
mqttMillis = millis();
analogMillis = millis();
Serial.begin(9600);
digitalWrite(Buzzer, LOW);
connectToAP(ssid);
mqttSetupBrokerNCB();
mqttConnect();
mqttSubscribe();
}
void loop() {
if (millis() - mqttMillis >= 500){
mqttClient.loop();
mqttMillis = millis();
}
int value = analogRead(Accelerometer);
Serial.println(value);
char buf[6];
itoa(value, buf, 10);
publishTopic(RotaryTopicPub, buf);
if (value >= 1 && value <= 1365)
{
//Serial.println("Normal");
}
else if (value > 1365 && value <= 2730)
{
//Serial.println("Raining");
}
else if (value >2730)
{
tone(Buzzer, 31);
BuzzerState = HIGH;
// char buff[2] = "0"; // 1 char string: '0'+null
// buff[0] = Buzzer ? '1' : '0';
// publishTopic(BuzzerTopicPub, buff);
//Serial.println("Someone is breaking in");
}
char buff[2] = "0"; // 1 char string: '0'+null
buff[0] = BuzzerState ? '1' : '0';
publishTopic(BuzzerTopicPub, buff);
}