Wochenend-Projekt: Einschlaflicht v01.02

Ich dachte mir es wäre doch toll, wenn man ein kleine Lampe hat, die solange leuchtet bis man eingeschlafen ist und dann ausgeht.

Die Lampe an der ich baue Leucht soll nach dem einschalten (Wenn man den Knopf drückt) etwa 1 min lang leuchten, dann soll sie ausgehen. Wenn man den Knopf an der Lampe länge drückt blinkt sie je nachdem wie lange man drückt, – erst ganz schnell, dann etwas langsammer und dann noch mal ein wenig langsamer. Das Blinken zeigt an in welchen Einschalfmodus sich die Lampe befindet. Lässt man wärend dem Blinken die Taste los, so ist die Leuchtdauer je Modus 2 min., 5 min. oder 10 min.

Das ganze ist aber noch nicht ausgegoren und benötigt noch ein wenig „Entwicklungsarbeit“.

Der nachfolgende Code funktioniert schon mal mehr recht als schlecht dennoch veröffenliche ich ihn hier schon einmal.

/*
 * Attiny13_Einschlaflampe_v01_02.c
 *
 * Created: 01.05.2018 11: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 ]
 *                       +--------+
 *
 */

#define F_CPU 960000UL  //Dalay anpassen wegen Fusebit
// #define F_CPU 12800UL  //Dalay anpassen wegen Fusebit

#define LED_PIN PB0       // PB0 as a LED pin
#define Taster	PB1
#define AN		1
#define AUS		0
 
#include <util/delay.h>
#include <avr/io.h>

int Leuchten(int iLeuchtdauer, int iAusAn);

int main (void)
{
	int iCounter=0;		// Zaehler für länge Tastendruck
	int iBlink=0;		// Blink intervall
	int iLeuchtdauer=120; //Standard Wert für Leuchten "iLeuchte / 2 = etwa Sekunden"
	// int iAusAn;
	
	DDRB  |= (1<<LED_PIN);     // Auf Ausgang schalten
	PORTB |= (1<<Taster);     // PullUp einschalten
	
	while (1)
	{
		if ((PINB & (1<<Taster))) // Prüfen auf Tastendruck
		{
			iCounter=0;
			Leuchten(iLeuchtdauer,AUS);
			//PORTB |= (1<<LED_PIN); // LED ON
			
		} 
				
		else 
		{
			if (iCounter==100)   // Wenn Taste gedrückt für 100 durchgänge gedrückt war
			{
				for(iBlink=0;iBlink<=20;iBlink++)
				{
					PORTB ^= (1<<LED_PIN); //Toggl
					_delay_ms(50);
					iCounter ++;
				}
				PORTB |= (1<<LED_PIN); // LED ON
				iLeuchtdauer =240; //2 Min
				// Leuchten(iLeuchtdauer,AUS);
			}
			else if (iCounter==150)
			{
				for(iBlink=0;iBlink<=20;iBlink++)
				{
					PORTB ^= (1<<LED_PIN); //Toggl
					_delay_ms(100);
					iCounter++;
				}
				PORTB |= (1<<LED_PIN); // LED ON
				iLeuchtdauer =600; //5 Min
				// Leuchten(iLeuchtdauer,AUS);
			}
			else if (iCounter==200)
			{
				for(iBlink=0;iBlink<=20;iBlink++)
				{
					PORTB ^= (1<<LED_PIN); //Toggl
					_delay_ms(300);
					iCounter++;
				}
				PORTB |= (1<<LED_PIN); // LED ON
				iLeuchtdauer =1200; // 10 Min
				// Leuchten(iLeuchtdauer,AUS);
			}
			else
			{
				//if(iCounter<=100)
				//PORTB &= ~(1<<LED_PIN); //Licht aus wenn nur kurz gedrückt wurde
				
				_delay_ms(50);
				iCounter++;
				if(iCounter==500)
					iCounter=0;
			}
		}
			
	}
	return 0;
}

int Leuchten(int iLeuchtdauer, int iAusAn)
{
	for (int i =0; i<=iLeuchtdauer;i++)
	{
		PORTB |= (1<<LED_PIN); // LED ON
		_delay_ms(500);
		if (!(PINB & (1<<Taster))) // Prüfen auf Tastendruck
			i=iLeuchtdauer+1;
	}
	
	if (iAusAn==AUS)
	{
		PORTB &= ~(1<<LED_PIN); // LED AUS
		_delay_ms(250);
		while(PINB & (1<<Taster))
		{
			// Warten bis Taste Gedückt wird Oder hier in den Sleepmodus
		}
		PORTB |= (1<<LED_PIN); // LED ON
		
	}
	
	return(0);	
}
Dieser Beitrag wurde unter Elektronik, Microcontroller, Wochenend Projekte veröffentlicht. Setze ein Lesezeichen auf den Permalink.