#include <WiFi.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"
#include <esp_now.h>
#include <Arduino.h>
#include <HCSR04.h>
#include <esp_sleep.h>
//Define necessary parameters
#define WIFI_SSID "Wokwi-GUEST"
#define uS_TO_S_FACTOR 1000000
#define TIME_TO_SLEEP 37.5 //Slep for 37.5 seconds
RTC_DATA_ATTR int bootCount = 0;
unsigned long time1;
unsigned long time2;
unsigned long time3;
unsigned long time4;
unsigned long time5;
uint8_t broadcastAddress[] = {0x8C, 0xAA, 0xB5, 0x84, 0xFB, 0x90};
esp_now_peer_info_t peerInfo;
// Define the trigger and echo pins for the HC-SR04 sensor
const int TRIGPIN = 12; // Replace with the actual pin
const int ECHOPIN = 25; // Replace with the actual pin
HCSR04 hc(TRIGPIN, ECHOPIN); //Create HCSR04 object (parameters: trig pin, echo pin)
// Send data
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("Send Status: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Ok" : "Error");
}
//Receiving Callback
void OnDataRecv(const uint8_t * mac, const uint8_t *data, int len) {
Serial.print("Message received: ");
char receivedString[len];
memcpy(receivedString, data, len);
Serial.println(String(receivedString));
}
// Initialize wi-fi
void initWiFi() {
// Connect to Wi-Fi
WiFi.begin(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
// Initialize ESP-NOW
void initESPNow() {
if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW initialization failed");
ESP.restart();
}
esp_now_register_send_cb(OnDataSent);
esp_now_register_recv_cb(OnDataRecv);
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
esp_now_add_peer(&peerInfo);
}
void setup(){
Serial.begin(115200);
delay(2000);
// Initialize
initWiFi();
initESPNow();
// Print wifi on time
time5 = millis();
Serial.print("wifi on: ");
Serial.println(time5);
//Wi-Fi start
WiFi.mode(WIFI_STA);
// Print wifi finish time
time1 = millis();
Serial.print("wifi: ");
Serial.println(time1);
//Get distance data
float distance = hc.dist();
// Print Senor time
time2 = millis();
Serial.print("Senor: ");
Serial.println(time2);
//Convert test data into status and send it out
String message;
if(distance<50){
message = "OCCUPIED";
}
else{
message = "FREE";
}
esp_now_send(broadcastAddress, (uint8_t*)message.c_str(), message.length() + 1);
// Print Transmition time
time3 = millis();
Serial.print("Trans: ");
Serial.println(time3);
delay(100);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);//Set wake up time
Serial.println("Going to sleep now");
esp_deep_sleep_start();//Start deep sleep
}
void loop(){
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND