Negeren van interrupts voor X-seconden

Arduino specifieke Software
Berichten: 1
Geregistreerd: 01 Jul 2020, 07:54

Negeren van interrupts voor X-seconden

Berichtdoor DarthVader072 » 01 Jul 2020, 08:09

Beste,

Voor mijn project detecteer ik de aanwezigheid van mensen en verstuur deze data vervolgens middels RF naar de ontvanger.
De uitdaging hierbij is dat mijn stroomverbruik nihil moet zijn, wat aardig lukt, maar het kan nog beter.

De hele set draait op een atMega328, met Panasonic PIR, een externe (hand)zender van Ali.
Ik verbruik in standby 0.07mA, eenmaal actief zo'n 3mA. Kortom, volgens berekeningen zou een jaar haalbaar moeten zijn.

Zodra de PIR iemand detecteert schopt hij middels een interrupt de atMega wakker, die vervolgens een output hoog maakt die vervolgens weer via een octocoupler een signaal aan de handzender geeft.
Echter, wanneer er iemand aanwezig is wil ik niet dat de interrupt constant word wakker gemaakt. Dus wat ik probeer te maken is dat;

-- setup is aan het slapen [0.07mA]
-- PIR detecteert persoon, interrupt HOOG [3mA]
-- atMega output HOOG [3mA]
-- 1 a 2 sec delay [in deze delay de setup het liefst ook zo gauw mogelijk laten sluiten om stroom te besparen]
-- atMega moet weer gaan slapen en interrupt negeren voor 60 seconden [bij voorkeur dusdanig slapen dat de hele interrupt afgesloten word. Ik heb een testje gedaan waarbij de interrupt geen effect had maar wel stroom verbruikte bij detectie]
- na deze 60 seconden is een interrupt weer toegestaan

Dit is mijn code, aan jullie de vriendelijke vraag eens mee te kijken waarom dit niet lukt.

Code: Alles selecteren
#include <LowPower.h>
#include <avr/sleep.h>

const byte transistor = 13;
const byte ledPin = 13;
const byte interrupt_pin = 2;
volatile byte state = LOW;

uint32_t time_now;
uint32_t event_time;

void wake(){
  // cancel sleep as a precaution
  sleep_disable();
  // precautionary while we do other stuff
  detachInterrupt (0);
}  // end of wake

void setup() {
  Serial.begin(9600);
  pinMode(transistor, OUTPUT);
  pinMode(interrupt_pin, INPUT);
  digitalWrite(2, HIGH);

    for (int i = 0; i < 20; i++) {
    if(i != 2)//just because the button is hooked up to digital pin 2
    pinMode(i, OUTPUT);
  }

  //Disable ADC - don't forget to flip back after waking up if using ADC in your application ADCSRA |= (1 << 7);
  ADCSRA &= ~(1 << 7);
 
 
  //ENABLE SLEEP - this enables the sleep mode
  SMCR |= (1 << 2); //power down mode
  SMCR |= 1;//enable sleep
 
  //DISABLE BOD
  MCUCR |= (3 << 5); //set both BODS and BODSE at the same time
  MCUCR = (MCUCR & ~(1 << 5)) | (1 << 6); //then set the BODS bit and clear the BODSE bit at the same time

  //SET CLOCK PROCESSOR
  CLKPR = 0x80;
  CLKPR = 0x01;

  //Show that device is ON
  digitalWrite(ledPin, HIGH);
  delay (2000);
  digitalWrite(ledPin, LOW);
}

void loop() {

  ADCSRA = 0;

 
  // the interrupt must be attached each loop
  attachInterrupt(digitalPinToInterrupt(interrupt_pin),interrupt_routine, RISING);
  LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF); // sleep until interrupt
  detachInterrupt(digitalPinToInterrupt(interrupt_pin)); // remove interrupt
 
  if (state==HIGH){
    digitalWrite(transistor,HIGH);
    delay (1000);
  }

    if (state==HIGH){
    state = LOW;
    digitalWrite(transistor,LOW);   
    delay(1000);
    }
/*
    while (state == LOW)
{
  LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF); // sleep until interrupt
}
state = LOW;
*/
}

void interrupt_routine(){
  /*
  time_now = millis();
  if (time_now - event_time >= 10 * 1000)
  {
     event_time = time_now;
     */
     state = HIGH;
 // }
}



Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Negeren van interrupts voor X-seconden

Berichtdoor shooter » 03 Jul 2020, 11:13

dat gaat niet, want je moet de tijd bijhouden en dat kan alleen met een actieve processor, of wellicht met een grote condensator en een weerstand om je pir actief te houden voor 60 seconden.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 24 gasten