/******************************************************************** * Halloween-Schaukel * * Stand: 26.08.2023 13:33 * * Ein kleines Programm für ATTiny45 oder 85. Es soll den Motor * meiner Halloween-Schaukel ein- und ausschalten. Ließe sich im Prinzip * auch mit einem NE555 realisieren, aber der Schaltungsaufwand ist mit * ATTiny deutlich geringer. Wenn doch NE555, dann einen Rechteckgenerator * mit einstellbarem Duty-Cycle bauen. * * Soll heißen: Der Motor wird nach einer bestimmten Zeit eingeschaltet * und läuft dann eine bestimmte Zeit. Dann wird er wieder * abgeschaltet und bleibt eine Weile aus */ // Hardwareabhängige Zuweisungen Attiny 45 (ACHTUNG: Neuen ATTiny zuvor mit Optiboot-Bootloader auf 8MHz internal Clock // versehen, damit die Fuses gesetzt werden. Ansonsten stimmt das // berechnete Timing für 'delay' und WS2812 nicht #define K1 4 // Ausgang zum Relais-Treiber am Attiny45 Pin 3 (PB4) #define RANDOM_INIT_PIN 3 // Analog-Input for init Random Generator (ATTiny-Chip Pin 2 (PB3)) #define OffWaitTimeMinsec 120 // 2 Min, Minimale Wartezeit in Sekunden für Motor aus #define OffWaitTimeMaxsec 200 // 3Min 20Sec, Maximale Wartezeit in Sekunden für Motor aus #define OnWaitTimeMinsec 120 // 2 Min, Minimale Laufzeit in Sekunden #define OnWaitTimeMaxsec 360 // 6 Min, Maximale Laufzeit in Sekunden int waitcnt; // Zeitzähler int RelayOn = 0; // Status des Relais void setup() { randomSeed(analogRead(RANDOM_INIT_PIN)); // Zufallsgenerator initialisieren pinMode(K1, OUTPUT); // Relais-Pin = Ausgang digitalWrite(K1, LOW); // Relais = aus waitcnt = random(OffWaitTimeMinsec, OffWaitTimeMaxsec); // Erste Wartezeit, bis Motor eingeschaltet wird } void loop() { delay(1000); // Eine Sekunde warten waitcnt = waitcnt - 1; // Wartezähler - 1 Sekunde if (waitcnt <0) { // Ist Zeit abgelaufen? switch (RelayOn) { // Ja nach Relais-Status.... case 1: // Wenn Relais = ON RelayOn = 0; // Relaisstatus = off digitalWrite(K1, LOW); // Relais ausschalten waitcnt = random(OffWaitTimeMinsec, OffWaitTimeMaxsec); break; default: RelayOn = 1; // Relaisstatus = on digitalWrite(K1, HIGH); // Relais einschalten waitcnt = random(OnWaitTimeMinsec, OnWaitTimeMaxsec); break; } } }