Ziel: Extrem Energieeffizienter Betrieb eines Raspberry Pi im Wohnwagen inkl. zyklischem Start, Alarmüberwachung. Übertragung Systemstatus und Alarme an Backend/Smartphone über Wi-Fi oder LTE.
🔋 Stromversorgung & Energieoptimierung
- Versorgung: 12 V LiFePO₄-Akku mit 200Ah
- Regler: 3.3 V MP1584 für den ATmega328P
- Raspberry Pi 4: Strom wird über MOSFET Treiber nur bei Bedarf aktiviert. Buck converter 5V 10A
- RTC-Modul (DS3231): Weckt ATtiny4313 periodisch via Interrupt (ca. 3 µA Standby)
- MPU-Modul
- Keypad zur Pin-Eingabe
- RFID Karte zum Aktivieren/deaktivieren
- Alarmsirene und kleiner Piezo zum quittieren
- Verteiltes System von ATmega328P die über 4-Draht verbunden sind (Wakeup-Line von main and die nodes, Alarm-Line von Nodes an Main, 2 x A/B für RS485 Kommunikation)
- Gesamtsystem im Sleep: <30 µA Stromverbrauch mit aktivem Watchdog
| Komponente | Modell/Typ | Funktion |
|---|---|---|
| Mikrocontroller | ATtiny4313 (DIL) | Zentrale Steuerung |
| RTC-Modul | DS3231 | Zeitgeber für Zyklusstart |
| Taster | Digital, mit Pull-Up | Start-/Shutdown-Steuerung |
| 2 x Alarmkontakt | Reed-Schalter o.Ä. | Fenster-/Türüberwachung |
| LED | 3.3 V | Statusblinker alle 10 s wenn Armed. Wenn Alarm flackern. Ansonsten aus. |
| UART | TX/RX auf 3.3 V | Kommunikation mit Raspberry Pi |
| Alarmausgang | GPIO an Treiber mit 12v schaltausgang | Anschluss von Verbraucher wie zum Beispiel Sirene |
| Schaltausgang | GPIO an Treiber der 12 V auf einen 5 V 5A DC-DC Converter bringt. | Stromzufuhr für Raspberry und weitere 5 V Verbraucher |

| Arduino PIN | Physischer Pin | Pin | Funktion | Richtung | Beschreibung |
|---|---|---|---|---|---|
| 1 | PA2 | Reset | Eingang | Für ISP | |
| 0 | 2 | PD0 | UART RX | Eingang | Kommunikation RPi → ATtiny |
| 1 | 3 | PD1 | UART TX | Ausgang | Kommunikation ATtiny → RPi |
| 4 | PA1 | ||||
| 5 | PA0 | ||||
| 2 | 6 | PD2 | INT0 (RTC Alarm) | Eingang | Weckt ATtiny |
| 3 | 7 | PD3 | Taster | Eingang | Kurz-/Lang-Druck |
| 4 | 8 | PD4 | I²C SDA | I²C | RTC-Kommunikation |
| 5 | 9 | PD5 | I²C SCL | I²C | RTC-Kommunikation |
| 10 | GND | Ground | |||
| 6 | 11 | PD6 | Status-LED | Ausgang | Blinkt alle 30s |
| 7 | 12 | PB0 | RPi Power Enable | Ausgang | Steuert MOSFET mit 12V der über Buck-Converter RPi versorgt |
| 8 | 13 | PB1 | Alarmkontakt 1 | Eingang | Fenster-/Türkontakt (Hüllschutz) |
| 9 | 14 | PB2 | Alarmkontakt 2 | Eingang | zusatzkontakte wie fliegengitter falls Fenster offen. |
| 10 | 15 | PB3 | Alarmausgang | Ausgang | Ansteuerung Verbraucher über 12 V Treiber (z.B. Sirene) |
| 11 | 16 | PB4 | |||
| 12 | 17 | PB5 | MOSI | Eingang | ISP |
| 13 | 18 | PB6 | MISO | Ausgang | ISP |
| 14 | 19 | PB7 | SCL | Eingang | ISP |
| 20 | VCC | Versorgung | Eingang | am 3,3 V Buck-Converter |
Arduino Main
ATmega328P hat 3 PCINT Gruppen jeweils für die Bänke B, D und D:
| Vektor | Pin-Gruppe | Register | Pins |
|---|---|---|---|
| PCINT0_vect | PORTB | PCMSK0 | PB0–PB7 (D8–D13 + SPI) |
| PCINT1_vect | PORTC | PCMSK1 | PC0–PC5 (A0–A5) |
| PCINT2_vect | PORTD | PCMSK2 | PD0–PD7 (D0–D7) |
Wichtige Kriterien für die Wahl der Pin:
- Möglichst viele Interrupteingänge in meiner Hand
- Hardware-Interrupts sollen für Taster genutzt werden um Debouncing zu ermöglichen
- Interrupt von der Peripherie (RTC, MPU, RFID, PIR) können auf einen gemeinsamen PCINT Vector wenn notwendig.
- Die Software Serial benötigt einen Interrupt auf dem RX pin. Damit ist die Gruppe nicht mehr für andere Interrupts in Code außerhalb von Software Serial (oder auch andere Instanzen von Software Serial) nutzbar.
- Da zwei Software Serial eingesetzt werden, sind das schon zwei PCINT vectoren die nicht genutzt werden können. Daher wählte ich die PINs so dass auf den Gruppen eh bereits viele Standardfunktionen wie HW-Serial, SPI, I2C, Xtal genutzt werden.
- Daher Port / PCINT2_vect für Eingänge, wodurch ich auf zusätzliche 4 zusätzliche IRQ Eingänge (PD4-PD7) komme. Zum Vergleich: Da SPI genutzt wird hätte PCINT0_vect / PortB nur 2 IRQ Pins.
| Use-Case | Status ✅ / ⚠️ / ❌ | Kommentar |
|---|---|---|
| 2× Taster | ✅ | D3 (INT1) & D5 (PCINT2) |
| 1× Status-LED | ✅ | A0 / PC0 |
| RTC via I²C | ✅ | PC4/PC5 (A4/A5) |
| RTC Wakeup (Interrupt) | ✅ | PD2 (INT0) |
| MPU via I²C | ✅ | PC4/PC5 (A4/A5) |
| MPU Interrupt | ✅ | PD4 (PCINT2) |
| Raspberry Power Switch | ✅ | PB6 (XTAL1) |
| Alarmgeber Schaltausgang | ✅ | PB7 (XTAL2) |
| RFID via SPI | ✅ | PB2–PB5 |
| RFID IRQ | ✅ | PD7 |
| RFID Stromschaltung | ✅ | PD6 über ULN |
| RS-485 Kommunikation | ✅ | SW Serial auf PB0 (RX) / PB1 (TX) |
| Victron VE.Direct UART | ✅ | SW Serial auf PC2/PC3 |
| I²C Geräte (RTC, MPU, MCP) | ✅ | PC4/PC5 |
| Piezo Signalgeber | ✅ | PC1 (A1) |
| HW | Pin | Arduino | Funktion | Verwendung | Interrupt | Interrupt-Vektor |
| 1 | RESET | RESET | ISP RST (evtl. auch an Raspberry zum Flashen über Bootloader HW-Serial) | |||
| 2 | PD0 | D0 | HW UART RX | Kommunikation mit Raspberry Pi über TTL 3,3V | Nein | – |
| 3 | PD1 | D1 | HW UART TX | Kommunikation mit Raspberry Pi über TTL 3,3V | Nein | – |
| 4 | PD2 | D2 | INT0 / Taster | System-Taster für Start und Shutdown | Ja | INT0 |
| 5 | PD3 | D3 | INT1 / Taster | Externer Taster um System kurzzeitig in Bereitschaft für Interaktionen (z.B. Alarm deaktivieren) zu versetzen | Ja | INT1 |
| 6 | PD4 | D4 | Digital In / Peripherie Interrupt | RTC Interrupt für tägliches Aufwach-Event | Ja | PCINT2 |
| 7 | VCC | |||||
| 8 | GND | |||||
| 9 | PB6 | XTAL1 | Digital Out / Power Switch | Raspberry Power über MOSFET Treiber um den High-Power 5V Buckconverter zu schalten | Nein | – |
| 10 | PB7 | XTAL2 | Digital Out / Alarm Switch | Alarmgeber (z.B. Sirene) mit Strom versorgen. Kann entweder über ULN2003 (<500ms) oder über MOSFET betrieben werden | Nein | – |
| 11 | PD5 | D5 | Digital In / Peripherie Interrupt | MPU IRQ / Alarm bei Erschütterung/Neigung/Bewegung des Wohnwagens | Ja | PCINT2 |
| 12 | PD6 | D6 | Digital Out / Power Switch | RFID Power (über ULN2003 für GND) | Nein | PCINT2 |
| 13 | PD7 | D7 | Digital In / Peripherie Interrupt | RFID IRQ | Ja | PCINT2 |
| 14 | PB0 | D8 | RS485 RX (SW Serial) | Software Serial an RS485 Treiber | Ja | PCINT0 |
| 15 | PB1 | D9 | RS485 TX (SW Serial) | Software Serial an RS485 Treiber | Nein | PCINT0 |
| 16 | PB2 | D10 | SPI SS | RFID SS | Nein | PCINT0 |
| 17 | PB3 | D11 | SPI MOSI | RFID MOSI / RFID MOSI | Nein | PCINT0 |
| 18 | PB4 | D12 | SPI MISO | RFID MISO / ISP MISO | Nein | PCINT0 |
| 19 | PB5 | D13 | SPI SCK | RFID SCK / ISP SCK | Nein | PCINT0 |
| 20 | AVCC | |||||
| 21 | AREF | |||||
| 22 | GND | |||||
| 23 | PC0 | A0 | Digital Out | Status LED (An/Watchdog/Alarm-Status/Fehler/Shutdown) | Nein | PCINT1 |
| 24 | PC1 | A1 | Piezo | Quittierungston für Alarm (de-)aktivierung (evtl. über Treiber ULN2003) | Nein | PCINT1 |
| 25 | PC2 | A2 | SW UART RX | Verbindung zu Victron MPPT Solar Charger | Ja (in SoftwareSerial Lib) | PCINT1 |
| 26 | PC3 | A3 | SW UART TX | Verbindung zu Victron MPPT Solar Charger | Nein | PCINT1 |
| 27 | PC4 | A4 | I2C SDA | Verbindung zu RTC, MPU und Port Extender | Nein | PCINT1 |
| 28 | PC5 | A5 | I2C SCL | Verbindung zu RTC, MPU und Port Extender | Nein | PCINT1 |
🧠 Betriebs- und Alarmzustände
🔁 operatingMode
Off: Kein BetriebPeriodic: Pi startet durch RTC-Alarme (zyklisch)On: Pi bleibt dauerhaft anAlert: Alarm wurde ausgelöst
stateDiagram-v2
[*] --> off
off --> alert: Alarm-In
off --> periodic: RTC event
off --> on: Button
periodic --> on: Button
periodic --> on: (PI) set_state
periodic --> alert: Alarm-In
periodic --> off: (PI) ack_shutdown
on --> alert: Alarm-In
on --> off: (PI) ack_shutdown
alert --> on: (PI) quit_alert
| State in | State out | Trigger | Comment |
| off | periodic | RTC event | Once a day the RTC will start the PI |
| off | on | Button | Start PI permanent due to user button press |
| periodic | on | Button | Start PI permanent due to user button press |
| on | off | Serial msg: „ack_shutdown“ | Pi confirms that an ordinary shutdown took place. Power can be turned off |
| periodic | off | Serial msg: „ack_shutdown“ | Pi confirms that an ordinary shutdown took place. Power can be turned off |
| off | alert | Alert-Contact | alarm loop has been triggered |
| periodic | alert | Alert-Contact | alarm loop has been triggered |
| on | alert | Alert-Contact | alarm loop has been triggered |
| alert | on | Serial msg: „quit_alert“ | Alarm stopped. Pi keeps on. |
Ausgangslogik:
| Ausgang | Off | Periodic | On | Alert |
| Pi-Power | 0 | 1 | 1 | 1 |
| Signal | 0 | 0 | 0 | 1 |
| Status LED | Armed: Slow / Disarmed: Off | Fast |
Event- / Status-Matrix
| Event / Input | Off | Periodic | On | Alert |
| Button | On | On | noop | x |
| RTC | Periodic | noop | x | x |
| Serial set_state | noop | OK | OK | x |
| Alert-Contact | Alert | Alert | Alert | x |
| Serial ack_shutdown | noop | Off | Off | x |
| Serial quit_alert | noop | noop | noop | On |
🚨 alarmMode
Disarmed: Alarmüberwachung ausArmed: Überwachung aktiv
🔄 Zustandsübergänge
| Auslöser | Aktion |
|---|---|
| Taster kurz (<1 s) | Pi einschalten |
| Taster lang (>3 s) | Pi herunterfahren (außer im Alert-Modus) |
| RTC-Alarm (DS3231) | Pi einschalten im Periodic-Modus außer wenn Alter oder Permanent |
| Alarmkontakt öffnet | alarmMode → Alert |
| Seriell vom RPi: | |
set_mode permanent | → operatingMode permanent |
set_alarm armed | → alarmMode armed |
shutdown | → Poweroff 10s nach Bestätigung |
set_next_cycle 04:00:00 | → RTC-Alarm neu setzen |
💬 Serielles Protokoll (UART)
Baudrate: 9600 bps
Pegel: 3.3 V TTL (direkt kompatibel mit Raspberry Pi)
RPi → ATtiny:
set_mode periodic
set_alarm armed
set_next_cycle 06:00:00
shutdown
ATtiny → RPi:
status armed
shutdown
⏱️ LED mit Watchdog-Timer
- LED blinkt alle 30 Sekunden für ca. 100 ms
- Getriggert durch Watchdog Interrupt + Softwarezähler
- Kein Sleep-Ausfall, Stromverbrauch bleibt gering
🔧 ISP-Anschluss für Programmierung
| ISP Pin | Funktion |
|---|---|
| PA2 | RESET |
| PB7 | SCK |
| PB6 | MISO |
| PB5 | MOSI |





