Your new topic does not fit any of the above??? Check first. Then post here. Thanks.

Moderator: igrr

User avatar
By Piman
#93749 Hello is there somebody who can help me with my code it's a PIR sensor using ESP NOW the code works but does not send pin activity some help please.. :!:
Code: Select all/*********
  andy
  Complete project details at
*********/

#include <ESP8266WiFi.h>
#include <espnow.h>

#define MESH_ID        6734922
#define GROUP_SWITCH   1
#define GROUP_HT       2
#define GROUP_MOTION   3
#define timeSeconds 10
uint8_t   receiverAddress[]      = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
bool      ack_received;

typedef struct struct_message {
  int     mesh_id;
//  int     motionSensor;
  uint8_t sensor_id[6];
  byte    category;
  int    status;
  float   temperature;
  float   humidity;
  float   battery;
} struct_message;

struct_message msg;

// Set GPIOs for LED and PIR Motion Sensor
const int led = 2;
const int motionSensor = 5;

// Timer: Auxiliary variables
unsigned long now = millis();
unsigned long lastTrigger = 0;
boolean startTimer = false;

// Checks if motion was detected, sets LED HIGH and starts a timer
void IRAM_ATTR detectsMovement() {
  Serial.println("MOTION DETECTED!!!");
  digitalWrite(led, HIGH);
  startTimer = true;
  lastTrigger = millis();
}

void setup() {
  // Serial port for debugging purposes
 // Serial.begin(115200);
 
  // PIR Motion Sensor mode INPUT_PULLUP
  pinMode(motionSensor, INPUT_PULLUP);
  digitalRead(motionSensor);
  // Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
  attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);

  // Set LED to LOW
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  ack_received = false;

  WiFi.mode(WIFI_STA);
  if (esp_now_init() != 0) {
    delay(100);
    ESP.restart();
  }
  esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
  esp_now_register_send_cb(OnDataSent);
  esp_now_add_peer(receiverAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
  sendReading();

}
void loop() {
 
  // Current time
  now = millis();
  // Turn off the LED after the number of seconds defined in the timeSeconds variable
  if(startTimer && (now - lastTrigger > (timeSeconds*1000))) {
    Serial.println("Motion stopped...");
    digitalWrite(led, LOW);
    startTimer = false;
  }
 // #ifdef TEST_NODE
 // sendReading();
//  delay(5000);
//#else
//  if ( ack_received == true)   gotoSleep();
//#endif
  //if ( millis() >= longest_up_time)   gotoSleep();
}

void sendReading() {

  msg.mesh_id = MESH_ID;
  msg.category = GROUP_MOTION; // GROUP_SWITCH or GROUP_MOTION
  WiFi.macAddress(msg.sensor_id);
  msg.status = digitalRead(motionSensor);
  msg.battery =  analogRead(A0) * 4.2 / 1023;   // voltage divider
//#ifdef TEST_NODE
 // msg.status = random(0, 2);
 // msg.battery = 3.5;
//#endif
  esp_now_send(receiverAddress, (uint8_t *) &msg, sizeof(msg));
}

void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {

  ack_received = true;
}
//}
User avatar
By sophiaabigail
#93771 My take on ultra low power, battery-based, low-cost, real-time trigger sensors to monitor doors and motion or make them act as wall switches ...
In this project, we see how 192.168.o.1 easy it is to connect a PIR motion sensor device to ESP32. PIR motion sensor will give a LOW (logic zero volts). It means, in the code, you have to wait for the pin to go low. Once the pin goes low, you can call the desired function.