Budik Drimal - vzbudi te az se vyspis

Jaroslav Lukesh lukesh na seznam.cz
Sobota Únor 4 14:41:15 CET 2017


Mám potřebu spát i ve dne. Asi je to rokama. Když mi doktorka dala nějaké 
prášky, abych se v noci dlouho a dobře vyspal, tak jsem se vyspal tak dobře, 
že když prášek jsem si dal naštěstí teda v pátek, vzbudil jsem se až v 
neděli. Tudy fakt cesta nevede, ať se paní dochtorka nezlobí, ale takhle si 
funkci kouzelné zelené pilulky nepředstavuju.

Protože se mi už několikrát stalo, že mě rodina taky nechala zlomyslně od 
odpoledne spát a vzbudil jsem se až ráno, udělal jsem si budík, který budí 
podle cyklů spánku. Budí ve fázích spánku - dřímání a pak každý REM stav, 
který je cca každých 90 minut po usnutí. Začíní to pípat o 5 minut dřív a 
končí to po 10 minutách, každou minutu to jedno pípnutí přidá.

Praktické zkušenosti z několikatýdenního provozu jsou, že když člověk není 
pod vlivem léků - stačí i blbý ibalgin, nebo zdecimovanej virózou, tak těch 
90 minut na jeden spánkový cyklus přesně sedí, jinak jsou ty cykly delší. 
Slyším vždy 4. až 6. zapípání v cyklu, vstávám do osmého. Většinou spím 2 
cykly, tedy 3h, přerušení vzbuzením na WC i uprostřed spánkového cyklu vede 
k úplnému probuzení a nepokračování ve spánku.

pokud chvilku po zapnutí začne divoce blikat a pípat, tak by bylo záhodno ho 
nabít, ale on po chvilce přestane a nechá vás vyspinkat. Když se probudíte a 
ledka nebude blikat ale furt svítít, tak ho už musíte nabít, jinak hodně 
ublížíte baterce.

Je to sice jenom fofr konstrukce s attiny85 a nebádal jsem nad lowpower 
nastavením, prostě ta baterka má skoro 1ah tak to není třeba řešit a už to 
ani neřeším, prostě užívám ho a stačí mi tak jak je. Taky by se tam mohlo 
dát pro mini 3V3/8MHz a dosáhnout mikroampérové spotřeby, ale tenčí se mi 
zásoby tak jsem tam dal ten digispark.

Konstrukce:
Digispark AtTiny85
http://www.ebay.com/itm/Digispark-Kickstarter-ATTINY85-Arduino-General-Micro-USB-Development-Board-/351877226756
nabíječka - modul TP4056
http://www.ebay.com/itm/MICRO-USB-1A-Battery-Charging-Module-TP4056-Precise-CA-/262434722764
Li-Ion z mobilu
krabička s vypínačem na 3xAA (vyřezaný vnitřek, ponechaný jen vypínač)
http://www.ebay.com/itm/2PCS-3-AA-4-5V-Battery-Holder-Box-Case-with-cover-switch-wire-3xAA-3x1-5V-SF602-/302171537680
pasivní elektromagnetický chrchláček, odpor 33R
http://www.ebay.com/itm/3V-5V-12V-24V-Active-Passive-Buzzer-Beeper-Electromagnetic-Type-Free-P-P-/262768636277
červená LED, odpor 1k
Tlačítko na umlčení ppání (jo, budu vstávat, ale spím dál tak zas budí až 
další cyklus) je sice nějak započato a snad naprogramováno, ale není 
vymazleno ani osazeno. Na fotce byste viděli černou krabičku s dírkou na 
chrchlák, ledkou a vypínačem, takže ani nemá cenu ji dělat.

Budík Dřímal tedy funguje tak, že když uznám, že už fakt nemůžu a jdu si 
lehnout, vezmu si krabičku, kterou když ulehnu, zapnu a dám vele sebe. Já 
když lehnu, tak většinou snad do čtvrtminuty spím.


#define __AVR_ATtiny85__
// to je tu kvůli konfiguraci pro měření napětí baterky
#define BEEPER 0
#define LED 1
#define maindelay 1000  // 6 x 1,000 vteřin x10 = minuta
byte TICHO = 0;
int napeti = 3700;

long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V 
reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || 
defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || 
defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || 
defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 
1.1*1023*1000
  return result; // Vcc in millivolts
}

void gong(byte opak= 1){
  for (byte j=1; j<=opak; j++){
    if (!digitalRead(2)) TICHO = 1;
    if (!TICHO){
      for (byte i=20; i>0; i--){
        analogWrite(BEEPER, i);
        delay(44);
      }
    }
  }
  analogWrite(BEEPER, 0); // pro jistotu
}

void delayblink(byte svit=255){ // 6 vteřin
    analogWrite(LED, svit);
    delay(maindelay);
    if (napeti > 3500) analogWrite(LED, 0);
    delay(maindelay);
    analogWrite(LED, svit);
    delay(maindelay);
    if (napeti > 3500) analogWrite(LED, 0);
    delay(maindelay);
    analogWrite(LED, svit);
    delay(maindelay);
    if (napeti > 3500) analogWrite(LED, 0);
    delay(maindelay);
}


void drimota(){ // 20 minut
  for (byte i=0; i<=200; i++){
    delayblink(4);
  }
}
void spanek_1(){ // 60 minut (+ 15 + 10)
  for (int i=0; i<=550; i++){
    delayblink(4);
  }
}
void spanek(){ // 80 minut
  for (int i=0; i<=790; i++){
    delayblink(4);
  }
}


void minutku(byte opak = 1){ // bim-bam po minutě
  for (byte j=1; j<=opak; j++){
    for (byte i=0; i<=10; i++){
      delayblink(255);
    }
  gong(j);
  }
  TICHO = 0;
}

void setup() {
  // put your setup code here, to run once:
  pinMode(2, INPUT_PULLUP); //THIS IS P2, P2 is analog input 1, so when you 
are using analog read, you refer to it as 1.
  pinMode(BEEPER, OUTPUT);       //0 is P0, 1 is P1, 4 is P4 - unlike the 
analog inputs,
  analogWrite(BEEPER, 0); // pro jistotu
  pinMode(LED, OUTPUT);       //0 is P0, 1 is P1, 4 is P4 - unlike the 
analog inputs,

  napeti = readVcc();
  delay(10);
  napeti = readVcc();


  if (napeti < 3700) {
    for (byte i=0; i<=100; i++){
      digitalWrite(LED, 0);
      analogWrite(BEEPER, 24);
      delay(100);
      digitalWrite(LED, 1);
      analogWrite(BEEPER, 0);
      delay(100);
   }
  } else   gong();

  drimota();
  minutku(10);
  spanek_1();
  minutku(10);

}


void loop() {

  napeti = readVcc();
  if (napeti < 3500) analogWrite(LED, 16);

    spanek();
    minutku(10);


}




Další informace o konferenci Hw-list