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.