Wochenend-Projekt: Tasmota Firmware auf eine Gosund Steckdose

Ursprünglich wollte ich die Tasmota Firmware mit dem Arduino aufspielen. Leider habe ich es mit der neuen Arduino IDE nicht hin bekommen. Mit Arduino wäre es natürlich super gewesen, denn dann hätte ich mir keine FTDI232 Schnittstelle besorgen müssen.

Vorne Weg!

220 Volt sind kein Spaß! Die Steckdose niemals im geöffneten Zustand in die Steckdose stecken! Für Schäden übernehme ich keine Haftung. Die hier vorgestellte Methode darf nur von einem Fachmann nachgemacht werden!

Folgende Dinge werden gebraucht:

  1. Computer (lol)
  2. FTDI Programmer mit USB Kabel
  3. Firmware von Tasmota (55 Gosund SP1 v23 ) http://thehackbox.org/tasmota/release/
  4. Software zum Programmieren (nodemcu-flasher-master): https://github.com/nodemcu/nodemcu-flasher
  5. Gosund Steckdose
  6. Schraubendreher oder Pins mit dreieckigen Profil

So wird es gemacht:

  • Die Steckdose aufschrauben und wie im Bild zu sehen die Leitungen des FTDI mit den Anschlüssen der Steckdose verbinden. WICHTIG: den Jumper am FTDI auf 3,3V stellen! Bei 5V geht der Chip kaputt.

Man könnte auch die GND Leitung und die 3,3 Volt Leitung an den ESP anlöten, aber daraus würde sich ein paar Nachteile ergeben. Erstens ist es ein gefrimmel die Leitungen alle dort an zu löten und zweitens, und dass ist eigentlich der Hauptgrund, kann man so an Hand der LED den Status nicht sehen. Bei der Verdrahtung wie oben sieht man, dass beim normalen Start (USB des FTDI in den Computer) die Steckdose blau blinkt. Bei Rest (komme ich später noch darauf zu sprechen) blinkt nichts, die LED bleibt aus. Und wenn die Tasmota Firmware richtig aufgespielt wurde blinkt die LED nach dem Programmieren und Neustart (USB des FTDI aus- und wieder einstecken in den Computer) rot. Das alles wird nicht angezeigt wenn man nur den ESP verlötet.

  • Die Software (nachdem diese installiert wurde) aus dem Verzeichnis: …\nodemcu-flasher-master\Win64\Release\ESP8266Flascher.exe starten.

Sollte noch ein 32-Bit-Windows am start sein, so die ESP8266Flascher.exe aus dem WIN32 Verzeichnis nehmen. Nach dem Start der Software folgenden Einstelllungen wählen:
Com-Port müsste alleine gefunden werden, wenn nicht dann einstellen.

Wichtig! den SPI Mode auf DOUT stellen, da man die Übertragung der Daten nur mit zwei Pins sequenziell macht und die Adressen dabei nicht berücksichtigt werden. Alle anderen Modi funktionieren nicht mit der so vorgenommenen Verkabelung. Gemein ist nur, dass die Software, wenn ein anderer SPI Mode gewählt wurde munter Daten hin schickt und so tut, als ob alles in Ordnung wäre.

Sobald die Software eingestellt ist, kann der ESP in den Programmiermodus geschaltet werden. Dies ist eine enorme Aufgabe für einen „Grobmotoriker“ wie mich, da ich die Verbindung zwischen Reset und GND mit einer Pinzette mache und gleichzeitig den USB Stecker stecken muss. (Man könnte auch eine Drahtbrücke zwischen beiden Pins anlöten, wenn man mit der Pinzette nicht zurecht kommt.)

  • Also I00 und GND muss verbunden (bei mir mit Pinzette) sein und dann darf erst Strom auf die Schaltung (USB einstecken) kommen.

Jetzt kommt der Vorteil wenn man es so verlötet hat wie oben beschrieben ist. Denn hat man alles richtig gemacht, also der Strom kam bei verbundenen Pins (I00 und GND), so blinkt die LED an der Steckdose nicht. Hat man es falsch gemacht dann blinkt die LED blau und man kann nicht programmieren. Sollte die LED blinken dann noch mal USB zeihen, Pins verbinden und dann noch mal USB stecken.

Hinweis zum Blinken: Ich meine  das dauerhafte Blinken der Gosund Steckdose.

Blinkt nichts, dann kann man den Button „Flash(F)“ unter der Registerkarte „Operationen“ in der ESP8266Flascher.exe Software drücken.

Ist der Flash-Vorgang abgeschlossen kann man den USB-Stecker ziehen und dann noch mal zum Test stecken (Ohne verbundenen Pins I00 und GND). Wenn alles richtig gelaufen ist, blinkt die LED rot und man kann die Steckdose wieder von allen Kabeln befreien (entlöten) und dann wieder zusammen bauen.

Veröffentlicht unter Allgemein, Elektronik, Microcontroller, Wochenend Projekte | Schreib einen Kommentar

Halbjahres-Projekt

diese Jahr war das große Projekt unseren Garten zu machen. Viele Leute haben uns geholfen. Meine Frau war „Projektleiterin“ 🙂 Hier und da sind noch ein paar Verbesserungen nötig, aber im Großen und Ganzen sind wir fertig.

 

Vorher:

 

Nachher:

Veröffentlicht unter Allgemein, Wochenend Projekte | Schreib einen Kommentar

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.

Veröffentlicht unter Allgemein | Schreib einen Kommentar

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);	
}
Veröffentlicht unter Elektronik, Microcontroller, Wochenend Projekte | Schreib einen Kommentar

Wochenend-Projekt: elektronischer Würfel v1.06

Die Firmware vom Würfel habe ich optimiert. Nun fällt er in den Schlafmodus wenn er nicht gebraucht wird und verbraucht dann nur noch 0.06 µA. Nach dem Tastendruck wacht er wieder auf und wird vom Watchdog resetet.

/*
 * Wuerfel_V01_06.c
 *
 * Created: 15.04.2018 20:57:00
 * Author : Bernd
 *
 *
 * Chip type: Attiny13a
 * Clock frequency: SUT_CKSEL auf INTRCoSC_128KHZ_14CK_64MS (128kHz / 8 = 16kHz)
 *
 *													  +--------+
 *        [ rest (leer)							(PB5) |1*     8| (VCC)  Power								]
 *        [ Taster								(PB3) |2      7| (PB2)  LEDs - links unten | rechts oben	]
 *        [ LEDs - rechts unten | links oben	(PB4) |3      6| (PB1)  LEDs - mitte links | mitte rechts	]
 *        [ Ground								(GND) |4      5| (PB0)  LED1								]
 *													  +--------+
 *
 */ 

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

#define LED1_PIN        PB0
#define Taster			PB3
#define DELAY_MAX       (512)
#define DELAY_MIN       (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>

int Augenanzahl = 0; // einfacher Zähler für Würfel Augenanzahl
uint16_t min, sek;

int StartStopAni(int AnzahlBlinken);

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

	

int main(void)
{

	//Watchdog ausschalten!
	MCUSR &= ~(1<<WDRF);
	WDTCR |= (1<<WDCE) | (1<<WDE);
	WDTCR = 0x00;
		
	DDRB =((1<<LED1_PIN) | (1<<PB1) | (1<<PB2) | (1<<PB4)); // Ports auf Ausgang
	DDRB= ~(1<<Taster);										// Port auf Eingang
	PORTB |= (1<<Taster);									// Pullup für Eingang
	
	StartStopAni(30);
	
	PORTB =0b00001000;
	
	while (1) // Endlos Schleife
	{ 
		for (min=10; min>=1; min--)  //Schleifen-konstruckt, wegen Zeit bis zum einschlafen
		{
			for (sek=1500; sek>=1; sek--)
			{
				_delay_ms(50);
								
				if (!(PINB & (1<<Taster)))	// Abfrage ob Switch gedrückt
				{
					// Schleifenwerte nach betätigen der Taste wieder hoch setzen
					min=10; 
					sek=1500; 
					
					PORTB =0b00001000;
					_delay_ms(500);	 // kurze Pause - alle LEDs kurz aus, damit man sieht der Würfel würfelt.
					
					switch(Augenanzahl)	// i Auswerten
					{
						case 0:
						{
							// Zahl 1 --> i=0
							PORTB =0b00000001;
							break;
						}
						case 1:
						{
							// Zahl 2 --> i=1
							PORTB =0b00000100;
							break;
						}
						case 2:
						{
							// Zahl 3 --> i=2
							PORTB =0b00000101;
							break;
						}
						case 3:
						{
							// Zahl 4 --> i=3
							PORTB =0b00010100;
							break;
						}
						case 4:
						{
							// Zahl 5 --> i=4
							PORTB =0b00010101;
							break;
						}
						case 5:
						{
							//Zahl 6 --> i=5
							PORTB =0b00010110;
							break;
						}
					}
					
					// Port wieder auf Eingang setzen (Pullup)
				    PORTB |= (1<<Taster);

				}
				Augenanzahl++;	// bei jedem Schleifendurchlauf i Erhöhen
				if (Augenanzahl==6) // Wenn i = 6 dann i wieder auf 0 setzen
				{
					Augenanzahl=0;
				}
			}
			
			StartStopAni(30);

			// 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<<PB3);
		
			sei();
			
			PORTB =0b00001000; // Sollten LEDs noch Leuchten vor Schlafen ausschalten.
				
			set_sleep_mode(SLEEP_MODE_PWR_DOWN);
			sleep_mode();
				
			// **************** 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();
		}
		
	}
	return (0);
}




int StartStopAni(int AnzahlBlinken)
{
	for (int blink=0; blink!=AnzahlBlinken; blink++) // Blinken bis der Watchdog dem Spuk ein Ende macht oder die AnzahlBlinken erreicht ist
	{
		PORTB ^= (1<<LED1_PIN); //Toogle (Ein-, Ausschalten der LED
		_delay_ms(50); // Warten damit LED eine Change hat zu blinken
	}
return (0);	
}




		// wdt_reset();

 

 

Veröffentlicht unter Elektronik, Microcontroller, Wochenend Projekte | Schreib einen Kommentar

Wochenend-Projekt: elektronischer Würfel v1.01

Das Krippenlicht muss warten. Nachdem mein Board so gut funktioniert hat, wollte ich ein lange von mir geplantes Projekt starten, – einen elektronischen Würfel. Das Programm und die Platine sind recht trivial und meinen Elektronik- und Programmierkenntnissen entsprechend. Aber er funktioniert! Das Programm in seiner ursprünglichen Form war mit einer Switch() Auswahl, welche ich aber den ganzen Samstag nicht zum laufen bekommen habe. Sogar der Debugger von meinem Entwicklungsstudio ist mit Programmfehler ausgestiegen, so dass das ich den Debugger im Windows immer wieder neu starten musste. Am Abend hatte ich die Nase voll, weil ich weder den Fehler finden konnte noch mit dem Debugger irgend etwas herausfinden konnte. Ich setzte mich mit einem Arbeitskollegen in Verbindung (der beruflich embedded Code schreibt) und zusammen konnten wir die Fehler mit dem Switch() nicht finden. So dann haben wir das Problem mit vielen IF() Anweisungen gelöst.

Kurze Erklärung:
In einer Endlosschleife wird bei jedem Durchlauf ein Zähler (i) um Eins (i++) erhöht und ein Input abgefragt. Wenn der Zähler 5 hat (Augenzahl 0 bis 5 sind 6) wird der Zähler auf 0 gesetzt. Wenn es einen Input gibt (Switch gedrückt) Wird der Zähler i ausgewertet und je nachdem welchen Wert i beim drücken des Switches hatte die dementsprechenden LEDs eingeschaltet. Der Zufallsgenerator ist sozusagen der Mensch, der den Switch drückt, – weil er nicht wissen kann wie hoch i in dem Moment des Drückens ist.

Weitere Anmerkung:
ich hatte als Widerstände nur 330 Ohm und habe diese genommen. Da auf manchen Ausgängen zwei LEDs sind, wären hier niedriger Widerstände besser um das Leuchten der LEDs gleichmäßiger zu bekommen. Als Batterie kann von 3,3Volt bis 5 Volt genommen werden (ich habe 4,5v (3xAA)).

 

Bild von der Schaltung:

El. Würfel

 

/*
 * Attiny13_Wuerfel_v1_01.c
 *
 * Created: 04.03.2018 09:57:00
 * Author : Bernd
 */ 

#include <avr/io.h>
#include <util/delay.h>



int main(void)
{
	DDRB = 0b00010111; // Datenrichtungsbit 1 = Ausgang
	PORTB =0b00001000; // Pullup Wiederstand 1 = Ein (für Eingang)
  
	int i=0; // einfacher Zähler für Würfel Augenanzahl
	
while (1){ // Endlos Schleife

		if(PINB != 0b00001000) // Abfrage ob Switch gedrückt 
			{
				
				 _delay_ms(60);	 // kurze Pause
								
				if (i==0)	// i Auswerten
				{
						// Zahl 1 --> i=0
						PORTB =0b00000001;
					
				}
				if (i==1)
				{
						// Zahl 2 --> i=1
						PORTB =0b00000100;
					
				}
				if (i==2)
				{
						// Zahl 3 --> i=2
						PORTB =0b00000101;
						
				}
				if (i==3)
				{
						// Zahl 4 --> i=3
						PORTB =0b00010100;
						
				}
				if (i==4)
				{
						// Zahl 5 --> i=4
						PORTB =0b00010101;
						
				}
				if (i==5)
				{
					//Zahl 6 --> i=5
					PORTB =0b00010110;
				
				}
			_delay_ms(1000); // kurze Pause, damit Würfel angezeigt wird
			PORTB =0b00001000; // nach Pause alle LEDs wieder ausschalten
			
			

			}	
		i++;	// bei jedem Schleifendurchlauf i Erhöhen 
		if (i==6) // Wenn i = 6 dann i wieder auf 0 setzen
			{
			 i=0; 
			}
	
    }
	return (0);
}
Source zu AtTiny13_Wuerfel_v1_01
Veröffentlicht unter Elektronik, Microcontroller, Wochenend Projekte | Schreib einen Kommentar

Wochenend-Projekt: Entwicklungsboard für AtTiny13

Vor einigen Jahren hatte ich für unsere Weihnachtskrippe eine „Kerzenlicht Simulation“ mit einem ATtiny13 und einer LED gebaut. Meine Tochter und ich fanden das Licht letztes Weihnachten zu dunkel und wir wollten mit einer helleren LED das ganze Projekt noch einmal nachbauen. Leider nachdem wir die passende LED gefunden hatten, haben wir feststellen müssen, dass unser ISP-Programmiergerät sich nicht mehr ohne weiteres unter Windows 10 installieren lies. Außerdem war mein selbstgebasteltes Experimentierboard nicht sorgfältig gelagert worden und es haben sich ein paar Kabel gelöst. Also habe ich mir ein neues ISP-Programmiergerät, welches unter Windows 10 läuft gekauft und diese Wochenende endlich Zeit gefunden, das Experimentierboard zu bauen.

Mit dem Programm BlackBoard habe ich einen Bauplan auf Lochraster erstellt. Das Programm ist einfach zu bedienen und für meine Zwecke vollkommen ausreichend.

Lochrasterplatine:

Kurze Erklärung:

  • Der Switch wird zum Reseten des Microcontroller gebraucht. (Falls sich das Programm mal aufhängt oder ein Neustart von Nöten ist)
  • Die LED (Wenn der Juper gesetzt ist) Zeigt an wenn der Microkontroller beschrieben oder gelöscht wird. Ist der Jumper nicht gesetzt, so kann der Port ohne LED genutzt werden.
  • Der LP2950 wandelt die Eingangsspannung (im Plan der rote Jumper = Batterieanschluss) auf 5V herunter, so kann Theoretisch eine Batterie zwischen 5V und 30V genommen werden. Mir langen 5V – 12V.

Hier das Board:

Kleine Programm zum Testen des Boards:

Lässt die LED blinken, wenn der Jumper gesetzt ist.

/*
 * Blink ISP 001.c
 *
 * Created: 25.02.2018 08:57:00
 * Author : Bernd
 */ 

#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
	DDRB = 1;

    while (1) 
    {
		PORTB =1;
		_delay_ms(5);
		PORTB =0;
		_delay_ms(20);
    }
}
Blink Programm
Veröffentlicht unter Elektronik, Microcontroller, Wochenend Projekte | Schreib einen Kommentar

Wartungsarbeiten

Heute wieder ein wenig die Seite auf Vordermann gebracht.
Bilder vom Event hinzugefügt.

 

Veröffentlicht unter Allgemein, Wartungsarbeiten | Schreib einen Kommentar

Wartungsarbeiten

Heute die Seite wieder etwas auf Vordermann gebracht.

Veröffentlicht unter Wartungsarbeiten | Schreib einen Kommentar

Aquarium ausgelaufen

Mein Aquarium ist ausgelaufen. Vermutlich war es der Unterschrank, der sich verzogen hatte. Zwei Tage bevor das Desaster seinen Lauf genommen hat, habe ich beim Fernsehschauen einen lauten Knacks von Richtung Aquarium gehört. Das war sehr wahrscheinlich die Holzplatte auf dem das Becken stand. Zum Glück ist keine Scheibe gerissen sonder das Wasser ist aus einer Silikonfuge ausgetreten. So konnten wir das Wasser zum größten Teil ablassen und es war kein super Gau. Leider haben den Stress mein Skalar und ein Glühlichtsalmler nicht überstanden.

Bilder vom neuen Aquarium folgen bestimmt.

Veröffentlicht unter Aquarium | Schreib einen Kommentar