Arduino als Energiewächter und Alarmzentrale im Wohnwagen

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

KomponenteModell/TypFunktion
MikrocontrollerATtiny4313 (DIL)Zentrale Steuerung
RTC-ModulDS3231Zeitgeber für Zyklusstart
TasterDigital, mit Pull-UpStart-/Shutdown-Steuerung
2 x AlarmkontaktReed-Schalter o.Ä.Fenster-/Türüberwachung
LED3.3 VStatusblinker alle 10 s wenn Armed. Wenn Alarm flackern. Ansonsten aus.
UARTTX/RX auf 3.3 VKommunikation mit Raspberry Pi
AlarmausgangGPIO an Treiber mit 12v schaltausgang Anschluss von Verbraucher wie zum Beispiel Sirene
SchaltausgangGPIO an Treiber der 12 V auf einen 5 V 5A DC-DC Converter bringt.Stromzufuhr für Raspberry und weitere 5 V Verbraucher
Screenshot
Arduino PINPhysischer
Pin
PinFunktionRichtungBeschreibung
1PA2ResetEingangFür ISP
02PD0UART RXEingangKommunikation RPi → ATtiny
13PD1UART TXAusgangKommunikation ATtiny → RPi
4PA1
5PA0
26PD2INT0 (RTC Alarm)EingangWeckt ATtiny
37PD3TasterEingangKurz-/Lang-Druck
48PD4I²C SDAI²CRTC-Kommunikation
59PD5I²C SCLI²CRTC-Kommunikation
10GNDGround
611PD6Status-LEDAusgangBlinkt alle 30s
712PB0RPi Power EnableAusgangSteuert MOSFET mit 12V der über Buck-Converter RPi versorgt
813PB1Alarmkontakt 1EingangFenster-/Türkontakt (Hüllschutz)
914PB2Alarmkontakt 2Eingangzusatzkontakte wie fliegengitter falls Fenster offen.
1015PB3AlarmausgangAusgang Ansteuerung Verbraucher über 12 V Treiber (z.B. Sirene)
1116PB4
1217PB5MOSIEingangISP
1318PB6MISOAusgangISP
1419PB7SCLEingangISP
20VCCVersorgungEingangam 3,3 V Buck-Converter

Arduino Main

ATmega328P hat 3 PCINT Gruppen jeweils für die Bänke B, D und D:

VektorPin-GruppeRegisterPins
PCINT0_vectPORTBPCMSK0PB0–PB7 (D8–D13 + SPI)
PCINT1_vectPORTCPCMSK1PC0–PC5 (A0–A5)
PCINT2_vectPORTDPCMSK2PD0–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-CaseStatus ✅ / ⚠️ / ❌Kommentar
2× TasterD3 (INT1) & D5 (PCINT2)
1× Status-LEDA0 / PC0
RTC via I²CPC4/PC5 (A4/A5)
RTC Wakeup (Interrupt)PD2 (INT0)
MPU via I²CPC4/PC5 (A4/A5)
MPU InterruptPD4 (PCINT2)
Raspberry Power SwitchPB6 (XTAL1)
Alarmgeber SchaltausgangPB7 (XTAL2)
RFID via SPIPB2–PB5
RFID IRQPD7
RFID StromschaltungPD6 über ULN
RS-485 KommunikationSW Serial auf PB0 (RX) / PB1 (TX)
Victron VE.Direct UARTSW Serial auf PC2/PC3
I²C Geräte (RTC, MPU, MCP)PC4/PC5
Piezo SignalgeberPC1 (A1)
HWPinArduinoFunktionVerwendungInterruptInterrupt-Vektor
1RESETRESETISP RST (evtl. auch an Raspberry zum Flashen über Bootloader HW-Serial)
2PD0D0HW UART RXKommunikation mit Raspberry Pi über TTL 3,3VNein
3PD1D1HW UART TXKommunikation mit Raspberry Pi über TTL 3,3VNein
4PD2D2INT0 / TasterSystem-Taster für Start und ShutdownJaINT0
5PD3D3INT1 / TasterExterner Taster um System kurzzeitig in Bereitschaft für Interaktionen (z.B. Alarm deaktivieren) zu versetzenJaINT1
6PD4D4Digital In / Peripherie InterruptRTC Interrupt für tägliches Aufwach-EventJaPCINT2
7VCC
8GND
9PB6XTAL1Digital Out / Power SwitchRaspberry Power über MOSFET Treiber um den High-Power 5V Buckconverter zu schaltenNein
10PB7XTAL2Digital Out / Alarm SwitchAlarmgeber (z.B. Sirene) mit Strom versorgen. Kann entweder über ULN2003 (<500ms) oder über MOSFET betrieben werdenNein
11PD5D5Digital In / Peripherie InterruptMPU IRQ / Alarm bei Erschütterung/Neigung/Bewegung des WohnwagensJaPCINT2
12PD6D6Digital Out / Power SwitchRFID Power (über ULN2003 für GND)NeinPCINT2
13PD7D7Digital In / Peripherie InterruptRFID IRQJaPCINT2
14PB0D8RS485 RX (SW Serial)Software Serial an RS485 TreiberJaPCINT0
15PB1D9RS485 TX (SW Serial)Software Serial an RS485 TreiberNeinPCINT0
16PB2D10SPI SSRFID SSNeinPCINT0
17PB3D11SPI MOSIRFID MOSI / RFID MOSINeinPCINT0
18PB4D12SPI MISORFID MISO / ISP MISONeinPCINT0
19PB5D13SPI SCKRFID SCK / ISP SCKNeinPCINT0
20AVCC
21AREF
22GND
23PC0A0Digital OutStatus LED (An/Watchdog/Alarm-Status/Fehler/Shutdown)NeinPCINT1
24PC1A1PiezoQuittierungston für Alarm (de-)aktivierung (evtl. über Treiber ULN2003)NeinPCINT1
25PC2A2SW UART RXVerbindung zu Victron MPPT Solar ChargerJa (in SoftwareSerial Lib)PCINT1
26PC3A3SW UART TXVerbindung zu Victron MPPT Solar ChargerNeinPCINT1
27PC4A4I2C SDAVerbindung zu RTC, MPU und Port ExtenderNeinPCINT1
28PC5A5I2C SCLVerbindung zu RTC, MPU und Port ExtenderNeinPCINT1

🧠 Betriebs- und Alarmzustände

🔁 operatingMode

  • Off: Kein Betrieb
  • Periodic: Pi startet durch RTC-Alarme (zyklisch)
  • On: Pi bleibt dauerhaft an
  • Alert: 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 inState outTriggerComment
offperiodicRTC eventOnce a day the RTC will start the PI
offonButtonStart PI permanent due to user button press
periodiconButtonStart PI permanent due to user button press
onoffSerial msg: „ack_shutdown“Pi confirms that an ordinary shutdown took place. Power can be turned off
periodicoffSerial msg: „ack_shutdown“Pi confirms that an ordinary shutdown took place. Power can be turned off
offalertAlert-Contactalarm loop has been triggered
periodicalertAlert-Contactalarm loop has been triggered
onalertAlert-Contactalarm loop has been triggered
alertonSerial msg: „quit_alert“Alarm stopped. Pi keeps on.

Ausgangslogik:

AusgangOffPeriodicOnAlert
Pi-Power0111
Signal0001
Status LEDArmed: Slow / Disarmed: OffFast

Event- / Status-Matrix

Event / InputOffPeriodicOnAlert
ButtonOnOnnoopx
RTCPeriodicnoopxx
Serial set_statenoopOKOKx
Alert-ContactAlertAlertAlertx
Serial ack_shutdownnoopOffOffx
Serial quit_alertnoopnoopnoopOn

🚨 alarmMode

  • Disarmed: Alarmüberwachung aus
  • Armed: Überwachung aktiv

🔄 Zustandsübergänge

AuslöserAktion
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 öffnetalarmMode → 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 PinFunktion
PA2RESET
PB7SCK
PB6MISO
PB5MOSI

Schreibe einen Kommentar