#include <HardwareSerial.h>
#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
// Device and Wi-Fi Credentials
const char DEVICE_LOGIN_NAME[] = "5f3240b0-38d8-4486-927b-a9d54739461b";
const char SSID[] = "Wokwi-GUEST";
const char PASS[] = "";
const char DEVICE_KEY[] = "@zY3Hk23hodSKi@XD!HUW7oWL";
// Pin Definitions
#define SERIALOK_RX_PIN 4
#define SERIALOK_TX_PIN 2
// Debug Level
#define DEBUG_LEVEL 2
// Function Prototypes for Property Change Handlers
void onTempChange();
void onHumidChange();
void onPIRChange();
void onServoChange();
// Hardware Serial Object for Serial1
HardwareSerial Serialok(1);
// Cloud Properties
float dht22_humi;
float dht22_temp;
bool pir;
int servo, servo_val_ctrl;
// Initialize Cloud Properties
void initProperties() {
ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
ArduinoCloud.addProperty(dht22_humi, READ, ON_CHANGE, onHumidChange);
ArduinoCloud.addProperty(dht22_temp, READ, ON_CHANGE, onTempChange);
ArduinoCloud.addProperty(pir, READ, ON_CHANGE, onPIRChange);
ArduinoCloud.addProperty(servo, READWRITE, ON_CHANGE, onServoChange);
}
// Wi-Fi Connection Handler
WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);
void setup() {
Serial.begin(9600); // Initialize Serial Monitor at 9600 baud
Serialok.begin(9600, SERIAL_8N1, SERIALOK_RX_PIN, SERIALOK_TX_PIN); // Initialize Serial1 with specified pins
delay(1500); // Wait for 1.5 seconds to stabilize the serial connection
initProperties(); // Initialize IoT Cloud properties
ArduinoCloud.begin(ArduinoIoTPreferredConnection); // Start IoT Cloud connection
setDebugMessageLevel(DEBUG_LEVEL); // Set debug message level
ArduinoCloud.printDebugInfo(); // Print debug information
}
void loop() {
ArduinoCloud.update(); // Update the IoT Cloud state
// Check if servo value has changed and send the new value to Serialok
if (servo != servo_val_ctrl) {
Serial.print("d");
Serial.println(servo);
Serialok.print("d");
Serialok.println(servo);
}
servo_val_ctrl = servo; // Update control value
// Read sensor data from Serialok
if (Serialok.available()) {
char sensor_id = Serialok.read();
float value = Serialok.parseFloat();
if (Serialok.read() == char(13)) { // Check for carriage return
if (sensor_id == 'a') dht22_temp = value;
if (sensor_id == 'b') dht22_humi = value;
if (sensor_id == 'c') pir = bool(value);
}
}
}
// Handlers for property changes
void onTempChange() {
}
void onHumidChange() {
}
void onPIRChange() {
}
void onServoChange() {
}