Skip to content

Instantly share code, notes, and snippets.

@gorshkov-leonid
Last active February 5, 2025 21:40
Show Gist options
  • Save gorshkov-leonid/a22132b1730567f9c0c9b452628b5bd4 to your computer and use it in GitHub Desktop.
Save gorshkov-leonid/a22132b1730567f9c0c9b452628b5bd4 to your computer and use it in GitHub Desktop.
attiny13 water detector sleep mode
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>


#define F_CPU 128000UL
#define ledPin PB2

volatile bool inSleep = false;
volatile unsigned long x=0;
volatile unsigned int blinkTime=256; //for 256

// // todo: read about https://onlinedocs.microchip.com/pr/GUID-317042D4-BCCE-4065-BB05-AC4312DBC2C4-en-US-2/index.html?GUID-B0D2983A-5D31-405A-B4A0-1522DD663002

ISR(INT0_vect) {
    // blinkTime = 0;
}

ISR(TIM0_OVF_vect){
  x=(x+1)%blinkTime;
}

void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(PB3, INPUT_PULLUP);
    DDRB = _BV(DDB2);

    cli();                      // Disables all interrupts by clearing the global interrupt mask https://onlinedocs.microchip.com/pr/GUID-317042D4-BCCE-4065-BB05-AC4312DBC2C4-en-US-2/index.html?GUID-B0D2983A-5D31-405A-B4A0-1522DD663002             

    MCUCR = _BV(SE) | _BV(SM1); // MCU Control Register             -Enable sleep mode: power-down  / page 46 
    GIMSK = _BV(PCIE);          // General Interrupt Mask Register - Enable interrupt               / page 46
    PCMSK = _BV(PCINT3);        // Pin Change Mask Register        - Trigger on PCINT3              / page 47
    sei();                      // Enables interrupts by setting the global interrupt mask https://onlinedocs.microchip.com/pr/GUID-317042D4-BCCE-4065-BB05-AC4312DBC2C4-en-US-2/index.html?GUID-B0D2983A-5D31-405A-B4A0-1522DD663002  OR asm("sei");
}


void loop() {
    if (inSleep) {
        digitalWrite(ledPin, LOW);
        asm ("sleep");
    } else{
        TCCR0B |= _BV(CS01) | _BV(CS00);    //Prescaler to F_CPU/64
        // TCCR0B |= _BV(CS02);                //Prescaler to F_CPU/256
        // TCCR0B |= _BV(CS02) | _BV(CS00);    //Prescaler to F_CPU/1024

 	      TCCR0A |= _BV(WGM00) | _BV(WGM01);
 	      TIMSK0 |= _BV(TOIE0);               //Enable timer overflow interrupt

        // https://forum.arduino.cc/t/attiny13a-timer-overflow-interrupt-weird-behavior/87550/8
        // digitalWrite(ledPin, x%blinkTime == 0 || x%blinkTime == 2 || x%blinkTime == 4 ? HIGH : LOW); // for 256
        digitalWrite(ledPin, x%blinkTime >=0 && x%blinkTime <=3 || x%blinkTime >= 8 && x%blinkTime <= 11 || x%blinkTime >=16 && x%blinkTime <=19 ? HIGH : LOW); // for 64
    }
    inSleep = !(digitalRead(PB3) == LOW);
}     
@gorshkov-leonid
Copy link
Author

gorshkov-leonid commented Jan 12, 2025

image
GND и +3 от батарейки А123
GND и PB3 через воду
GND и PB2 к зумеру

PB2: +3 => звук
PB3: gnd => запустить пикалку

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment