Attiny13A пищалка на холодильник

Аватара
Автор темы
Attiny13
Сообщения: 2
Репутация: 1
С нами: 4 года 2 месяца

Attiny13A пищалка на холодильник

Сообщение #1 Attiny13 » 26 марта 2018, 18:40

Attiny13A пищалка на холодильник.jpg
Attiny13A пищалка на холодильник
Attiny13A пищалка на холодильник.jpg (101.56 КБ) 306 просмотров

Код

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/wdt.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define BUZZER_PIN 0
#define REED_SWITCH1_PIN 1
#define REED_SWITCH2_PIN 2
#define alarm_loop_cnt 21 //--- 7*9sec=63sec

volatile boolean f_wdt = 1;
int loop_CNT = 0;

void Alarm()
{
  pinMode (BUZZER_PIN, OUTPUT);  
  for 
(int i=0; i < 3; i++){
    digitalWrite(BUZZER_PIN, HIGH);
    _delay_ms(100);
    digitalWrite(BUZZER_PIN, LOW);
    _delay_ms(100);
  }
  // Установите любые контакты, используемые для ввода, чтобы снизить потребление энергии.
  pinMode(BUZZER_PIN,INPUT);
}

void setup(){
  for (byte i = 0; i <= 4; i++)
  {
    pinMode (i, INPUT);    
    digitalWrite 
(i, LOW);  
  
}
  setup_watchdog(9);
}

void loop(){
  if (f_wdt==1) 
  
{
    f_wdt=0;
    digitalWrite(REED_SWITCH1_PIN, HIGH);
    digitalWrite(REED_SWITCH2_PIN, HIGH);
   // _delay_ms(10);
    if (digitalRead(REED_SWITCH1_PIN) || digitalRead(REED_SWITCH2_PIN))
      loop_CNT++;
    else
      loop_CNT
=0;
    digitalWrite(REED_SWITCH1_PIN, LOW);
    digitalWrite(REED_SWITCH2_PIN, LOW);
    if (loop_CNT>alarm_loop_cnt)
    {
      Alarm();
      system_sleep();
    }
  }
}

void system_sleep() {
  cbi(ADCSRA,ADEN);                    //переключить аналого-цифровой преобразователь в положение OFF
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // режим сна
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  sbi
(ADCSRA,ADEN);                    // переключатель Аналого-цифровой преобразователь ВКЛ
}
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {
  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // установить значение тайм-аута сторожевого таймера
  WDTCR = bb;
  WDTCR |= _BV(WDTIE);
}
// Служба прерывания сторожевого таймера / выполняется, когда тайм-аут тайм-аута
ISR(WDT_vect) {  
  f_wdt
=1;
}

! ! !


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «STM 32, ATtiny»

Кто сейчас на форуме

Сейчас этот раздел просматривают: 1 гость