Leckagestrom identifiziert, behoben

This commit is contained in:
coelner 2021-01-25 13:38:49 +01:00
parent 4c9ca6f876
commit 04dbc13610
3 changed files with 42 additions and 21 deletions

View File

@ -7,7 +7,7 @@ VORSICHT! das maßgebliche VCC Rail beläuft sich auf 5V!
| PCB | Nutzen | Info |
|------|----------|---------------------------|
| D2 | Diode GND| M7, SMD 1N4007 |
| D2 | Diode GND| M7, SMD 1N4007, Freilauf |
| D3 | Diode VCC| nicht vorhanden |
| R8 | rote LED | 511 , wird auf GND gezogen, Pin 1 am L1|
| R13 | gelbe LED| 511 , wird auf GND gezogen, Pin 5 am L1|
@ -18,6 +18,7 @@ VORSICHT! das maßgebliche VCC Rail beläuft sich auf 5V!
| R34 | LCD | 221, Vorwiderstand |
| U1 | MCU | L1 Markierung |
| SP1 | Buzzer | [PT-3534FPQ], 3 Pin (Ground, Main, Feedback) |
| R7 | feedback In | 472, Q1 Strombegrenzer , HIGH |
| LB1 | | |
| SW1 | Button | TCK Test Pin, Default VCC Rail, Pressed GND |
|LCD-P | Display | Temp, PPM, Battery Level, 12 Pins 3 x 7 Digits, 3 Batterie Blöcke|
@ -42,5 +43,5 @@ Die JTAG Schnittstelle wurde nicht betestet und somit könnte diese beim Chip *L
- Obwohl kein NTC verbaut ist, wird eine Temperatur angezeigt (~ +1°C)
- Das LCD ist an die COM0-3 (Pin 21-24) sowie SEG0-7 (Pin 8-1) des HT1621B angeschlossen
- VDD (Pin 17) und VLCD (Pin 16) scheinen gebrückt
- Das LCD zeigt bei 4,7V zwei Balken der Batterie und bei 4,0V eine leere Hülle
- Beim Starten wird eine blaue Hintergrundbeleuchtung eingeschaltet
- Das LCD zeigt bei 4,7V zwei Balken der Batterie, bei 4,0V eine leere Hülle, bei 3,6V piepst das Gerät
- Beim Starten wird eine blaue Hintergrundbeleuchtung kurz eingeschaltet

View File

@ -1,47 +1,63 @@
# README ESP8266
Die aktuelle Implementierung ist für den ESP8266 vorgesehen.
Dabei wird per Interrupt eine Veränderung (FALLING) der LED Steuerleitungen überwacht. Zusätzlich wird an die Steuerleitung des Buzzers ein Ausgang gelegt. Optional kann der analoge Eingang zur Überwachung der Batteriespannung eingesetzt werden (Mindestens 200k Ohm Widerstand fehlen noch, dies hat aber rund 10µA (gemessen 6,96µA zur Folge).
Dabei wird per Interrupt eine Veränderung (FALLING) der LED Steuerleitungen überwacht. Zusätzlich wird an die Steuerleitung des Buzzers ein Ausgang gelegt. Optional kann der analoge Eingang zur Überwachung der Batteriespannung eingesetzt werden (Mindestens 200k Ohm Widerstand fehlen noch, dies hat aber rund 10µA (gemessen 6,96µA bei ~3,8V VBAT zur Folge). 3 volle LSD-NiMH kommen auf 4.4V ohne Last, nach Schottky-Diode 4.2V. Damit wäre vermutlich der geringe Ladestrom nicht übermäßig schädlich. Ein einfacher LiPo Akku mit Schutzschaltung dürfte ebenfalls hinreichend gut funktionieren.
| Funktion | Pin | Default |
|-----------|-----|---------|
| rote LED | D7 | High |
| gelbe LED | D6 | High |
| grüne LED | D5 | High |
| Buzzer | D2 | Low |
| Buzzer | D2 | High |
| GND | GND | - |
| VCC RM370 | 5V | - |
| Batterie | A0 | Floating|
| VCC RM370 | - | - |
| Batterie | A0 | - |
Durch die zwei Spannungsversorgungen und sowie unterschiedlichen VCC Rails ergeben sich in der Signalverarbeitung Probleme:
1. Die ESP8266 GPIOs sind nicht 5V tolerant (https://www.espressif.com/sites/default/files/documentation/Espressif_FAQ_EN.pdf Punkt 5.14)
2. Die Spannungslevel nach einem unidirectionalen LevelShifter sind falsch (https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf Kapitel 5.1)
3. Die Spannungslevel funktionieren wenn die Batterien an Spannung verloren haben und die V_USB des wemos D1 mini die VCC vom RM370 übernimmt
4. Wenn das Wemos D1 Board ohne Spannung ist, schweben die einzelnen GPIO
5. Eine Spannungsmessung der Batterien ist nicht möglich, da selbst ohne Batterien die Spannung ~4.1V beträgt
5. Eine Spannungsmessung der Batterien ist nicht möglich, da selbst ohne Batterien die Spannung ~4.2V beträgt
Die Lösungen sind vermutlich wie folgt:
1. Mit einem bidrectionalen Level Shifter kommt man auf passende Level
2. Siehe Punkt 1, vermutlich
3. Siehe Punkt 1 sowie den Rail vom RM370 mit 3.3V nutzen als Low Level
3. Siehe Punkt 1 sowie den Rail vom RM370 mit 3.3V nutzen als Low Level [3.3V Rail vom ESP funktioniert auch]
4. Auswirkungen noch unbekannt
5. keine
5. Spannungsteiler
Der Versuchsträger führt die Kabel nach unten hinaus, die wemos D1 mini Platine (3,5cm x 2,5cm)sowie der Logic Level Shifter (1,5cm x 1,5cm) passen auch auf den Batteriehalter innerhalb des Gehäuses. Problematisch ist die Kabelführung, da die Befestigungsschrauben das PCB ohne größere Spalte an das Gehäuse drücken. Wenn dünne Einzellitzen genutzt werden, so können diese durch die vorhandenen Löcher der JTAG-Header gezogen werden. Alternativ kann je nach Stärke auch an der Platine zur LED Seite bzw beim Buzzer nach oben hin Kabel durchgeführt werden.
Der Versuchsträger führt die Kabel nach unten hinaus, die wemos D1 mini Platine (3,5cm x 2,5cm) sowie der Logic Level Shifter (1,5cm x 1,5cm) passen auch auf den Batteriehalter innerhalb des Gehäuses. Problematisch ist die Kabelführung, da die Befestigungsschrauben das PCB ohne größere Spalte an das Gehäuse drücken. Wenn dünne Einzellitzen (z.B. wire wrapping wire 26AWG) genutzt werden, so können diese durch die vorhandenen Löcher der JTAG-Header gezogen werden. Alternativ kann je nach Stärke auch an der Platine zur LED Seite bzw. beim Buzzer nach oben hin Kabel durchgeführt werden.
Mittels Diode kann man den freien V+ Pin nutzen.
Mittels Diode (1N400X) kann man den freien V+ Pin nutzen. Damit kann das PCB auch über die Versorgungsspannung betrieben werden. Es liegen dann ~4,2V am Batteriekasten an! Die Nutzung von zwei BAT43 Dioden würde einerseits geringere Spannungsverluste bedeutet, andererseits den Reverse Current in den Batteriekasten verhindern. Die 4.2V
## Verkabelung
| Funktion | Pin ESP | LLS | RM370 |
|-----------|-----------|-----|--------|
| rote LED | D7 | 3 | R8 TP |
| gelbe LED | D6 | 2 | R13 TP |
| grüne LED | D5 | 1 | R12 TP |
| Buzzer | D2 | 4 | R7 TP |
| GND | GND | GND | (-) |
| VCC RM370 | - | HV | D3 TP |
| 3V3 RM370 | - | LV | R35 TP |
| VUSB ESP | 5V 1N400X | - | V+ |
| Batterie | A0 200k | - | (+) |
Grundverbrauch liegt bei 20 bis 30 µA (Errechnet: I=0.000059), nach der Modifikation liegt der Verbrauch bei rund 69µA.
## PCB
Die wesentlichen Eigenschaften des PCB wären:
1. Nutzung der Testpads auf der Unterseite
2. Schutzschaltung (P-MOSFET) vor Leckströmen (Nach Modifikation mit wemos D1 mini (kein V_USB), Level-Shifter liegt der Verbrauch bei 1.2mA)
2. ESP32-PICO oder ESP8285
2. Logic Level Shifter ( keine N-MOSFET, sondern P-MOSFET) für die GPIO
3. Spannungsteiler für den ADC 5V<->1V (440k (200k + 220k) und 100k) plus MOSFET
4. Schutzdiode für V_5V Rail
5. ESP32-PICO oder ESP8285
4. Schutzdiode für V_5V Rail
5. MOSFET für die VBAT
## Funktionsweise
Der eigentliche CO-Melder wird nicht verändert, es werden lediglich die Zustände erfasst und per WLAN weitergeleitet. Hierbei kommt ESP-Now zum Einsatz, ein WiFi Vendor Frame Format, welches ohne AP auskommt. der Payload wurde in einer Struktur geordnet, sodass man eine Präamble, eine eindeutige Kennung, den codierten Zustand sowie ein Flag für geringe Batteriespannung mitteilen kann.
@ -49,16 +65,21 @@ Maximal sind 20 Teilnehmer zugelassen, diese nutzen den Channel 3 und geben sich
Der Sketch verarbeitet maßgeblich zwei folgende Aufgaben:
- Statusüberwachung
- eingehende Broadcast Frames weiterleiten
Hierzu werden die LEDs per Interrupt überwacht. In der Realität leuchten die LEDs nur kurz aber für einen Menschen erkennbar auf, dies ist aber zu lange für eine einmalige Interruptauslösung. Die Beschränkung auf RISING funktionierte nicht wie erwünscht. Grundsätzlich wird in den Interrupts für die LEDs wird der Eigenzustand im Strukt rm370 ownState gespeichert, zusätzlich wird der globale Status angepasst.
Hierzu werden die LEDs per Interrupt überwacht. In der Realität leuchten die LEDs nur kurz aber für einen Menschen erkennbar auf, dies ist aber zu lange für eine einmalige Interruptauslösung. Die Beschränkung auf FALLING funktionierte nicht wie erwünscht. Grundsätzlich wird in den Interrupts für die LEDs wird der Eigenzustand im Strukt rm370 ownState gespeichert, zusätzlich wird der globale Status angepasst.
Sollte der globale Status nicht dem Eigenen entsprechen, so wird der Buzzer aktiviert. Ist der Buzzer durch das System selbst schon aktiv bzw. die LED rot oder gelb leuchten, dann wird der Buzzer nicht beeinflusst.
Ist der eigene Status entweder rot oder gelb, so wird diese Nachricht an alle anderen verschickt.
Werden Nachrichten empfangen, so werden diese mit dem eigenen Status abgeglichen und bei Code 'rot' oder 'gelb' wieder per Broadcast weitergeleitet. Weiterhin wird geprüft, ob diese Kennung schonmal empfangen wurde.
Nach 20 Sekunden wird der globale Status wieder zurückgesetzt. Dies setzt ein Ausbleiben eingehender Nachrichten voraus.
Der Test Knopf wird nicht unmittelbar erfasst, allerdings leuchtet die rote LED ebenfalls kurz auf, dadurch wird die Meldekette initiert.
## Trivia
- Der Buzzer summt leise wenn das Board programmiert wird.
- Das Wemos Board verbraucht rund 90mA über die VUSB Schiene
- [ToDo] Die Batterie werden trotz V_USB mit 16mA beaufschlagt. Ggf aber auch Querstrom oder reverse current! Nachdem die Spannung nicht weiter anstieg (3,94V) wurde nur noch ein Strom von 1,8mA gemessen
- intergrierter LevelShifter mit EN-Pin: TXB0104
## ToDo
@ -67,5 +88,4 @@ Nach 20 Sekunden wird der globale Status wieder zurückgesetzt. Dies setzt ein A
-[ ] alive Nachrichten
-[ ] receivebuffer Größe anpassen
-[ ] ringbuffer.next Implementierung
-[ ] Grundverbrauch und Leckageströme feststellen [Grundverbrauch liegt bei 20 bis 30 uA I=0.000059 Leckage über Level Shifter beim Buzzer sind 0,5mA]
-[ ] Minimales PCB entwerfen

View File

@ -102,7 +102,7 @@ void buzzerTest() {
}
warningTrigger = false;
//Failsafe
digitalWrite(BUZZER_Pin, LOW);
digitalWrite(BUZZER_Pin, HIGH);
debounceTrigger = false;
}
@ -120,7 +120,7 @@ void globalStatus() {
}
globalStart = 0;
//Failsafe
digitalWrite(BUZZER_Pin, LOW);
digitalWrite(BUZZER_Pin, HIGH);
LOG("Global ended");
}
if (alarmTrigger && !alarmGenerator.active()) {
@ -140,7 +140,7 @@ void setup() {
pinMode(YELLOW_Pin, INPUT_PULLUP);
pinMode(GREEN_Pin, INPUT_PULLUP);
pinMode(BUZZER_Pin, OUTPUT);
digitalWrite(BUZZER_Pin, LOW);
digitalWrite(BUZZER_Pin, HIGH);
attachInterrupt(digitalPinToInterrupt(RED_Pin), IntREDCallback, FALLING);
attachInterrupt(digitalPinToInterrupt(YELLOW_Pin), IntYELLOWCallback, FALLING);
attachInterrupt(digitalPinToInterrupt(GREEN_Pin), IntGREENCallback, FALLING);