Previous Entry Share Next Entry
Ночной светильник на ATtiny13
donpavlensio
Слабал таки два проекта, использовав прикупленные пару чипов ATtiny13,первый пошел

1. Ночной светильник в виде ядерного гриба




Корпус светильника распечатан на 3d принтере, модель взята с просторов тырнета, называется "Nuke lamp".
Управляет всем безобразие тинька, использован один светодиод, подтягивающий резистор на reset (опционально), датчик переключения сделан из клемника (трубка) и куска медной проволоки, при потрясывании кусок медной проволоки замыкает контакты, происходит переключение состояния светодиода. После 1,5 часов работы светильник выключается автоматически, дабы беречь батарейку, я использовал CR2032. Все криво спаяно навесным монтажем.

Вот внтуренности:


Код, для прошивки микроконтроллера если кому интересно, заливается из под среды Arduino
[нажмите, чтобы посмотреть]

  1. // Проект для лампы-светильника, реализованный на ATtiny 13
    // Created 07/01/2015 by donpavlensio.livejournal.com
    // Переключение светильника происходит за счет тактовой кнопки,
    // замыкающей пин reset на землю. Я использовал вместо кнопки
    // самодельный датчик наклоа/удара.
    // При каждом включении меняется статус диода и значение
    //запоминается в EEPROM. Для энергосбережения использован
    //режим сна
    //светодиод на пин 4
    //пин 5 (PB5/reset) через кнопку соединяется с землей
    // можно дополнительно его подтянуть резистором >= 10 кОм к vcc
    #include <avr/sleep.h>
    #include <EEPROM.h>
    #define ledPin 4
    boolean lampstat = 0; //статус светильника
    int addr = 0; // адрес ячейки энергонезависимой памяти EEPROM
    void setup()
    {
    pinMode(ledPin, OUTPUT);
    lampstat = EEPROM.read(addr); // читаем значение из EEPROM
    lampstat= !lampstat; // изменяем его на противоположное
    EEPROM.write(addr, lampstat); //записываем в EEPROM новое значение
                                         
    delay(10); //задержка нужна, чтобы даные успели записаться
              //  в EEPROM до ухода в сон
    }
    void loop()
    {
    if (lampstat){ // если lampsat истинно (то есть =1), то
      digitalWrite(ledPin, lampstat); //зажигаем светодиод
      for ( int i = 1; i <=180; i++){ //ждем 180 раз по 30 секунд то есть 1,5 часа, это нужно потому, что
        delay(30000);                 //таймер delay переполняется примерно за 40 секунд
      }
     
      lampstat = 0; //переключаем lampsat в 0
      EEPROM.write(addr, lampstat);//пишем в EEPROM
    delay(10); //ждем для записи
      digitalWrite(ledPin, lampstat);// выключаем светодиод
    }
    if(!lampstat){ //если lampsat ложно, то
    system_sleep(); //вызов программы сна
               
    }
    }
    void system_sleep(){ //спим беспробудным сном, откуда выведет
                  //  только перезагрузка
    ADCSRA &= ~(1 << ADEN); // перед сном отключим АЦП
    ACSR |= (1 << ACD); // и компаратор
    // для уменьшения энергопотребления во сне
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); // глубокий сон
    while(1) {
     
      sleep_enable(); // разрешаем сон
      sleep_cpu(); // спать!
    }
    }


?

Log in