#include <WiFi.h>
#include <WiFiUdp.h>
#include <coap-simple.h>
#include <DHTesp.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const IPAddress coap_server(134, 102, 218, 18);
const int coap_port = 5683;
const int dht_pin = 13;
WiFiUDP udp;
Coap coap(udp);
DHTesp dht;
bool LEDSTATE;
// CoAP server endpoint URL
void callback_light(CoapPacket &packet, IPAddress ip, int port) {
Serial.println("[Light] ON/OFF");
// send response
char p[packet.payloadlen + 1];
memcpy(p, packet.payload, packet.payloadlen);
p[packet.payloadlen] = NULL;
String message(p);
if (message.equals("0"))
LEDSTATE = false;
else if(message.equals("1"))
LEDSTATE = true;
if (LEDSTATE) {
digitalWrite(9, HIGH) ;
coap.sendResponse(ip, port, packet.messageid, "1");
} else {
digitalWrite(9, LOW) ;
coap.sendResponse(ip, port, packet.messageid, "0");
}
}
// CoAP client response callback
void callback_response(CoapPacket &packet, IPAddress ip, int port) {
Serial.printf(" → Got %d.%02d:\n", packet.code >> 5, packet.code & 0b11111);
char p[packet.payloadlen + 1];
memcpy(p, packet.payload, packet.payloadlen);
p[packet.payloadlen] = NULL;
Serial.println(p);
}
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// LED State
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
LEDSTATE = true;
// DHT22
dht.setup(dht_pin, DHTesp::DHT22);
// server url endpoints (callback for each)
coap.server(callback_light, "light");
// client response (single) callback
coap.response(callback_response);
// start coap server/client
coap.start();
}
void loop() {
Serial.printf("\nGet %s:%d/%s\n", coap_server.toString().c_str(), coap_port, "time");
int msgid = coap.get(coap_server, coap_port, "time");
delay(2000);
coap.loop();
float temp = dht.getTemperature();
Serial.printf("\nPut %f at %s:%d/%s\n", temp, coap_server.toString().c_str(), coap_port, "temperature");
coap.put(coap_server, coap_port, "temperature", std::to_string(temp).c_str());
delay(2000);
coap.loop();
}