Wochenend-Projekt: Einschlaflicht v01.06 Prototype

/*
* Attiny13_Einschlaflampe_v01_06_final.c
*
* Created: 25.06.2018 08:00:00
* Author : Bernd
*
*
* Chip type: Attiny13a
* Clock frequency: SUT_CKSEL auf INTRCoSC_128KHZ_14CK_64MS (128kHz / 8 = 16kHz)
*
* +--------+
* [ (PB5) |1* 8| (VCC) Power ]
* [ (PB3) |2 7| (PB2) ]
* [ (PB4) |3 6| (PB1) Button ]
* [ Ground (GND) |4 5| (PB0) LED White ]
* +--------+
*
*
* Kurze Beschreibung:
* -------------------
* - Die Lampe geht beim betätigen des Tasters an PB1 an (LED PB0 Leuchtet)
* - Ohne weiteres Drücken leuchtet sie etwa 20 Sekunden
* - Ein kurzes drücken schaltet die Lampe aus oder an
* - Durch langes Drücken kommt man in den Auswahl-Modus
* Es gibt drei Moden je nachdem wann man die Taste wieder los lässt
* -Moduswechsel durch langes Drücken des Tasters
* Modus 1 LED Blinkt langsam - hier wenn los gelassen wird leuchtet die Lampe etwa 5 min.
* Modus 2 LED Blinkt mittel - hier wenn los gelassen wird leuchtet die Lampe etwa 10 min.
* Modus 3 LED Blinkt schnell - hier wenn los gelassen wird leuchtet die Lampe etwa 15 min.
*
*/

// #define F_CPU 9600000UL //Delay anpassen wegen Fusebit
#define F_CPU 128000UL //Delay anpassen wegen Fusebit

#define LED_PIN PB0 // PB0 as a LED pin
#define Taster PB1
#define AN 1
#define AUS 0

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

// Leere Interrupt-Routine
ISR(PCINT0_vect)
{
}

int main (void)
{
//Watchdog ausschalten!
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00;

DDRB |= (1<<LED_PIN); // Auf Ausgang schalten
PORTB |= (1<<Taster); // PullUp einschalten

PORTB |= (1<<LED_PIN); // LED einschalten
_delay_ms(400); // Kurzes Entprellen vom Watchdog auffachen (Tastendruck)

int iLeuchtdauer=80; //Standard Wert für Leuchten "iLeuchtdauer / 4 = etwa Leuchtzeit in Sekunden
int iTimer=0;
int i = 0;

while (1)
{
if (!(PINB & (1<<Taster))) // Prüfen auf Tastendruck - Bei Druck Befehl ausführen
{
_delay_ms(500); // kurze Pause
if (!(PINB & (1<<Taster))) // Prüfen auf Tastendruck - Bei Druck Befehl ausführen
{
iTimer++; // Zähler für Auswahl erhöhen
if (iTimer==5)
{
for (i=0;i<=10; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(250);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 5*60*4; // etwa 5 Minuten Leuchtzeit

}
else if (iTimer==10)
{
for (i=0;i<=14; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(150);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 10*60*4; // etwa 10 Minuten Leuchtzeit

}
else if (iTimer==15)
{
for (i=0;i<=18; i++)
{
PORTB ^= (1<<LED_PIN); //Toggl
_delay_ms(100);
}
//Nach Toggle die LED einschalten und die Leuchtdauer setzen
PORTB |= (1<<LED_PIN); // LED einschalten
iLeuchtdauer = 15*60*4; // etwa 15 Minuten Leuchtzeit

}
}
else
{
PORTB ^= (1<<LED_PIN); //Toggl
iLeuchtdauer=80; // Leuchtdauer wieder auf Default setzen
_delay_ms(500);
}

}
else
{
iTimer=0; // Zähler für Auswahl auf Null setzen -Nicht schön hier

// Taste wurde nicht gedrückt counter wird weiter herunter gerechnet
// bis 0 dann wird geschlafen
if (iLeuchtdauer >= 0)
{
iLeuchtdauer--;
_delay_ms(250);
}
else
{
PORTB &= ~(1<<LED_PIN); // LED aus
//
// Schlafen
//
//
// Den ADC deaktivieren, brauchen wir nicht müsste aber pre Default aus sein.
power_adc_disable();

// Pin-Change Interrupt für die 4 Taster erlauben
GIMSK = (1<<PCIE);
PCMSK |= (1<<PB1);

sei();

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();

// iLeuchtdauer=80; // Unnötig wurde nur zum Test ohne Watchdog benötigt

// **************** Aufwachen und alles für den Reset über Watchdog vorbereiten ******
wdt_enable(WDTO_1S); // 1s Sekunden Watchdog einstellen
wdt_enable(WDTO_30MS); // 30ms Sekunden Watchdog einstellen

//tu nix und warte auf den Biss des Wachhundes
_delay_ms(5000); // Der Wachhund ist auf eine Sek gestellt. Im Delay sind es 5 Sekunden. - Also Reset
// wdt_reset();
}
}

}
}



//PORTB ^= (1<<LED_PIN); //Toggl
//PORTB &= ~(1<<LED_PIN); // LED aus
//PORTB |= (1<<LED_PIN); // LED einschalten
Attiny13_Einschlaflampe_v01_06_final.c

Hier die akuellen Bilder zum Prototyp der Einschlaflampe. Die verfeinerungen am Code habe ich noch nicht in Angriff genommen.

Dieser Beitrag wurde unter Allgemein veröffentlicht. Setze ein Lesezeichen auf den Permalink.