Für einfache und kompakte Projekte, die in der Arduino IDE entwickelt wurden, wie z.B. ein einfaches Zeit Relais, ist es logischer, einfache und kostengünstige Mikrocontroller zu verwenden. Da die Arduino IDE Mikrocontroller der ATtiny-Serie unterstützt, habe ich mich für dieses Projekt für den Mikrocontroller ATtiny13 entschieden.
Der ATtiny13 ist ein stromsparender 8-Bit-CMOS-Mikrocontroller mit AVR-RISC-Architektur. Durch das Ausführen von Befehlen in einem einzigen Zyklus erreicht der ATtiny13 eine Leistung von 1 MIPS bei einer Masterfrequenz von 1 MHz, was es dem Entwickler ermöglicht, das Verhältnis von Verbrauch zu Leistung zu optimieren.
Der ATtiny13-Mikrocontroller eignet sich hervorragend für kleine und kostengünstige Projekte, und die Unterstützung der Arduino-IDE-Programmierumgebung vereinfacht die Arbeit mit dem Mikrocontroller erheblich.
Neben dem Mikrocontroller enthält das Zeit Relais eine TM1637-Anzeige (Uhr), ein Relaismodul und zwei Uhrtasten.
Mit den Tasten (+/-) kann die Zeit von 1 bis 99 Minuten eingestellt werden, wenn die Timerzeit eingestellt ist, wird das Relais sofort aktiviert, wenn der Timer zurückgesetzt wird, schaltet das Relais die Last aus.
Um ATtiny13 in der Arduino-IDE zu unterstützen, müssen Sie ein paar einfache Schritte ausführen:
- Hinzufügen von Board-Unterstützung
Öffnen Sie in der Arduino-IDE die Registerkarte Datei > Einstellungen und fügen Sie einen Link zum Board-Manager hinzu.
https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
Wählen Sie die neue MicroCore by MCUdude-Karte aus und installieren Sie sie.
Wählen Sie als Nächstes unter Tools > Board das ATtiny13-Board aus.
- Um den Sketch zu flashen, benötigen Sie einen USBAsp-Programmierer
In meinem Fall verwende ich einen Mikrocontroller, der auf der Adapterplatine installiert ist, der Schaltplan ist recht einfach.
USBAsp Programmierer-Pinbelegung.
In den Board-Einstellungen müssen Sie die Attiny13-Unterstützung auswählen und die Frequenz auf 9,6 MHz intern einstellen, im EEPROM-Element die Option EEPROM nicht retanied auswählen, im Punkt „Timing“ die Option „Micros disabled“ auswählen.
Als nächstes müssen Sie die notwendigen Sicherungen für den Mikrocontroller einstellen, damit er immer mit der von Ihnen gewählten Frequenz arbeitet. Wählen Sie dazu in den Arduino-IDE-Einstellungen den USBasb-Programmierer aus und klicken Sie auf Extras > Bootloader brennen. Dieser Vorgang muss nur einmal ausgeführt und wiederholt werden, wenn Sie die Frequenz des Mikrocontrollers ändern.
Um den Sketch in den Arduino-IDE-Einstellungen herunterzuladen, wählen Sie den USBasb-Programmierer aus und klicken Sie auf der Registerkarte Sketch auf Load via Programmer (oder klicken Sie einfach auf die Schaltfläche Download).
#define CLK PB1 // TM1637
#define DIO PB0 // TM1637
#define UP PB3 // BUTTON +++
#define DOWN PB4 // BUTTON ---
#define OUT PB2 // RELAY
char i,tic;
bool w,w1=0,cl;
unsigned long times;
void setup(){
DDRB |= (1 << OUT);
PORTB &= ~(1 << OUT);
PORTB |= (1 << UP) | (1 << DOWN);
}
void loop(){
cl=0;
if(((PINB >> UP) & 1) == 0){i++;if(i>99){i=99;}cl=1;}
if(((PINB >> DOWN) & 1) == 0){i--;if(i<0){i=0;tic=0;}cl=1;}
if(i>0 || (i==0 && tic>0)){PORTB |= (1 << OUT);w=1;w1=1;}
else{PORTB &= ~(1 << OUT);w=0;w1=0;}
if(w==1&&cl==0){
if(millis()-times>999){times=millis();tic--;}
if(tic<0){tic=59;i--;}
}
tm_print(i*100+tic,w1,5);
}// end loop
void tm_dec(byte dig){
for(byte i = 0; i < 8; i++) {
DDRB |= (1 << CLK);del();
if (dig & 0x01)
DDRB &= ~(1 << DIO);
else
DDRB |= (1 << DIO);del();
DDRB &= ~(1 << CLK);del();
dig = dig >> 1;
}
DDRB |= (1 << CLK);
DDRB &= ~(1 << DIO);del();
DDRB &= ~(1 << CLK);del();
if (((PINB >> DIO) & 1) == 0)
DDRB |= (1 << DIO);del();
DDRB |= (1 << CLK);del();
}
void tm_stop(){
DDRB |= (1 << DIO);del();
DDRB &= ~(1 << CLK);del();
DDRB &= ~(1 << DIO);del();
}
void tm_start(){
DDRB |= (1 << DIO);del();
}
void tm_print(int t, bool pd_t, byte br){
tm_start();tm_dec(0b10001000 + br);
tm_dec(0x40);tm_stop();tm_start();
int data0 = t / 1000;
int data1 = t / 100 % 10;
int data2 = t / 10 % 10;
int data3 = t % 10;
for(byte n = 0; n < 4; n++){
int data;
switch(n){
case 0: data = data0;break;
case 1: data = data1;break;
case 2: data = data2;break;
case 3: data = data3;break;
}
switch(data){ // XGFEDCBA
case 0: data = 0b00111111;break; // 0
case 1: data = 0b00000110;break; // 1
case 2: data = 0b01011011;break; // 2
case 3: data = 0b01001111;break; // 3
case 4: data = 0b01100110;break; // 4
case 5: data = 0b01101101;break; // 5
case 6: data = 0b01111101;break; // 6
case 7: data = 0b00000111;break; // 7
case 8: data = 0b01111111;break; // 8
case 9: data = 0b01101111;break; // 9
}
if(n == 0){data0 = data;}
if(n == 1){data1 = data;}
if(n == 2){data2 = data;}
if(n == 3){data3 = data;}
}
if(pd_t==1){data1 = data1+0b10000000;}
tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}
void del(){delay(1);}
Der Sketch belegt 830 Byte (81 %) des Gerätespeichers. Insgesamt stehen 1024 Bytes zur Verfügung.
Globale Variablen belegen 14 Byte (21 %) Heapspeicher, sodass 50 Byte für lokale Variablen übrig bleiben. Maximal: 64 Bytes.