Waarom blijft mijn PIR-sensor hoog met ESP8266 breakout board?

Ik heb een PIR-sensor aangesloten op een Amica nodeMCU-kaart routing 5v van VIN en via USB-poort aangesloten voor testen. Wanneer bewegingsdetectie plaatsvindt, maakt deze verbinding met internet en verzendt deze gegevens naar IFTTT die ik op mijn telefoon ontvang.

Wanneer ik opstart, pauzeert de PIR voor kalibratie en wordt dan onmiddellijk HOOG en ontsteekt de beweging gedetecteerde oproep die ik op mijn telefoon ontvang. Vanaf dan gaat het echter nooit LAGEN maar elke 5-8 minuten stuurt nog een HIGH oproep door, zelfs als er geen beweging is.

Testen

  • Tried using separate 5v supply to PIR same thing happens
  • I have tried both retrigger modes (H & L) and experienced the same result
  • The same happens with the Adafruit featherwing huzzah board.
  • I have tested the PIR without a micro-controller and can confirm that it functions correctly -lighting an led
  • I have tested with an Arduino Nano with the same code and it functions correctly - lighting an led

My Code modified version of Arduino Playground PIR Project

//Sends IFTTT every 5 minutes it detects motion

#include 
//WiFi Settings

// Set up macros for wifi and connection.
#define SSID "my-network"   //SSID
#define PASS "mypassphrase"     //Network Password
#define HOST "maker.ifttt.com" //Webhost
//-------------------------------
const char* streamId   = "test";
const char* privateKey = "mysecretkey";

//PIR Settings
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 10;        

//the time when the sensor outputs a low impulse
long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 
//before we assume all motion has stopped
long unsigned int pause = 5000;  


int  interval = 1000;//Wait between dumps
boolean lockLow = true;
boolean takeLowTime;  
int ledPin = 1;
int pirPin = 2;    //the digital pin connected to the PIR sensor's output
int nPIR_detect;
int motion = 2;

int minSecsBetweenUpdates = 300;//5 minutes
long lastSend = -minSecsBetweenUpdates * 1000l;
//-------------------------------

// Begin Setup
void setup(){
  Serial.begin(115200);
  pinMode(pirPin, INPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
  for(int i = 0; i < calibrationTime; i++){
    Serial.print(".");
    delay(1000);
    }
  Serial.println(" done");
  Serial.println("SENSOR ACTIVE");
  delay(50);
   nPIR_detect = 0;  

 //Test ESP8266 module.
  Serial.println("AT");
  delay(5000);
  if(Serial.find("OK")){
    connectWiFi();
  }
}

void loop(){
 if(digitalRead(pirPin) == HIGH){
       digitalWrite(BUILTIN_LED, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         //makes sure we wait for a transition to LOW before any further output is made:
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         sendData(String(motion));
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(BUILTIN_LED, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       //if the sensor is low for more than the given pause, 
       //we assume that no more motion is going to happen
       if(!lockLow && millis() - lowIn > pause){  
           //makes sure this block of code is only executed again after 
           //a new motion sequence has been detected
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
}

void sendData(String motion){

  //Send the motion to IFTTT value1
  Serial.print("connecting to ");
  Serial.println(HOST);

 //Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(HOST, httpPort)) {
    Serial.println("connection failed");
    return;
  }

 //We now create a URI for the request
  String url = "/trigger/";
  url += streamId;
  url += "/with/key/";
  url += privateKey;
  url += "?value1=";
  url += "motion";

  Serial.print("Requesting URL: ");
  Serial.println(url);

 //This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + HOST + "\r\n" + 
               "Connection: close\r\n\r\n");
  delay(10);

 //Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");

}

boolean connectWiFi(){
  Serial.println("AT+CWMODE=1");
  delay(2000);
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial.println(cmd);
  delay(5000);
  if(Serial.find("OK")){
    Serial.println("Connection");
    return true;
  }
  else{
    Serial.println("No Connection");
    return false;
  }
}

OQ: Waarom blijft mijn PIR-sensor hoog met ESP8266 breakout board?

In wezen zie ik nooit het seriële bericht "motion ended at .."

3
Hoe converteer je het 5v-signaal naar 3.3v?
toegevoegd de auteur Al., de bron
Hoe zien de gemeten spanningsniveaus eruit? Is uw breakout-bord 5v tolerant?
toegevoegd de auteur Dave X, de bron
@Gerben welk 5v-signaal? (waarvan?)
toegevoegd de auteur Ben DeMott, de bron
@Gerben de pir converteert 5v naar 3v
toegevoegd de auteur Ben DeMott, de bron

3 antwoord

Ik weet zeker dat je beide waarschijnlijk hebt gedaan, maar voor het geval je dat niet hebt gedaan ...

Ik zie aan de hand van je code dat je Pin 2 gebruikt voor de PIR-sensor. Ik weet zeker dat je niet zo dom bent als ik elke keer dat ik een ESP8266 programmeer, maar controleer of je de PIR hebt verbonden met pin 2, dat is niet de verbinding met de naam D2, de GPIO2, die al dan niet is gelabeld.

Ervan uitgaande dat dat klopt, is het volgende mogelijke probleem mogelijk dat GPIO2 wordt gedeeld met TXD1, mogelijk dat dit wordt gebruikt. Dus probeer over te schakelen naar GPIO4.

2
toegevoegd
Het veranderen van GPIO2 naar GPIO4 werkte voor mij.
toegevoegd de auteur Owen, de bron

Ik heb hetzelfde probleem met Huzzah en een PIR. De PIR is lawaaierig en ik krijg elke 10-20 seconden een foute high, terwijl de code probleemloos werkt op een UNO. Ik denk dat het een probleem is dat HF-koppeling van wifi het amplificatiecircuit van de PIR verstoort. Ik zal proberen af ​​te schermen en caps/ferrieten om zich te ontdoen van de HF op de PIR of gebruik een andere voeding en koppel de signaallijn via optocoupler.

1
toegevoegd

De oplossing die ik heb gevonden voor dit probleem is het gebruik van een 10k-weerstand tussen de PIR-sensoruitgang en de ingangspen van de ESP8266.

Niet zeker of 10K de beste waarde is, iemand anders vindt misschien een betere waarde, maar voor nu werkt het voor mij prima.

John

0
toegevoegd