Arduino Asksin library

Begonnen von trilu, 06 August 2013, 10:02:17

Vorheriges Thema - Nächstes Thema

Dirk

ZitatShort zaehlt immer 1 hoch.
Long zaehlt beim key release eins hoch?
Ja, Short zählt immer.
Long sendet bei jeder Wiederholung den selben Counter. Beim release wird eins hochgezählt.

trilu

Ok! Ich bau das mal am 2. Weihnachtsfeiertag um.
Heute und Morgen gehört der Familie.

Euch allen hier ein frohes Weihnachtsfest!

trilu

fehler im key counter beseitigt...
zählt jetzt bei einem repeated long key press nicht mehr hoch.

Dirk

Super.
Das ging ja schneller als gedacht :)

Ich teste das heute Abend und werde berichten.

Gruß
Dirk

trilu

Hi Dirk,
War ja auch nur eine Kleinigkeit. Eine Zeile Code...
Das mit dem getconfig wurmt mich viel mehr!
Viele Grüsse
Horst

Dirk

Hi Horst,

So, habe nun einiges getestet und bin so erstmal begeistert. Dann kann ich mich ja mal ans "customizen" ran machen.
Dafür muss ich mich erst mal in deinen Code reinversetzen.

Ich habe inzwischen deinen Code auf dem Steckbrett ohne Arduino mit "nacktem" Atmega328p zum laufen gebracht. Das ganze ohne externen Quarz, nur mit internem Oszillator.
An zwei AA-Zellen komme ich mit eingeschaltetem Brown-Out (1,8 V) auf ca. 16 µA Standby-Verbrauch, ohne Brown-Out sind es sogar nur 0,16 µA. Sehr schön.

Werde als erstes mal die Batteriespannungsmessung einbauen, oder ist die schon drinn.

Gruß
Dirk

trilu

freut mich das ich dich begeistern konnte  8)
mit der batteriespannung bin ich noch am überlegen wie man die am besten implementieren könnte, sie soll ja möglichst universal sein und selbst keinen strom verbrauchen.

das hatte ich mal getestet um VCC direkt im AVR zu messen:
long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

Das funktioniert soweit ganz gut, misst aber erst hinter dem Spannungsregler vom Arduino.
Das heisst, wenn wir einen Arduino mit einem Lipo betreiben wollen, hilft das nicht weiter...

Zum messen der VCC vor dem Spannungsregler hatte ich über einen Widerstandsteiler nachgedacht, der
verbindet aber VCC mit Ground, es fliessen also immer ein paar uA in die Tonne...
Bis ich das fand :-)
http://jeelabs.org/2013/05/16/measuring-the-battery-without-draining-it/

Der nimmt zwei 10 mOhm widerstände, dadurch fliesst ein sehr sehr niedriger Strom, der normalerweise vom Arduino
nicht gut zu messen wäre, packt einen kleinen Kondensator in Reihe, der puffert genügend Strom um zu messen.

Aus meiner Sicht sollten wir uns ein Modul bauen, das sich konfigurieren lässt,
1. Batteriespannung = VCC (Meßmethode 1)
2. Batteriespannung > VCC (Widerstandsnetzwerk)

Wenn Methode 2 dann noch das Spannungsteiler Verhältnis als Parameter
Ich bau mal in das HM Modul einen Parameter den wir dann befüllen können, so dass bei allen Stausmeldungen der Batterie Status mitgeschickt wird...

Was hältst du davon?

Brown-Out sollte eigentlich im Power Mode 2-4 automatisch ausgeschaltet werden. Dazu gibts in der HM::power_poll folgendes Statement:
sleep_enable(); // enable the sleep mode

MCUCR |= (1<<BODS) | (1<<BODSE); // turn off brown-out enable in software
MCUCR &= ~(1<<BODSE); // must be done right before sleep
sleep_cpu(); // goto sleep

Falls das so nicht funktioniert muss ich da noch mal ran...

Viele Grüße
Horst

Samsi

Hallo Horst,

hast Du gesehen, er hat dort auch eine Schaltung mit einem Mosfet die gar keinen Strom verbraucht:

http://jeelabs.org/2013/05/17/zero-powe-battery-measurement/

;)
FHEM 5.5 / BBB Debian Wheezy

Homematic CFG-LAN

HM-Sec-MDIR / HM-Sec-SD / HM-Sec-WDS / HM-LC-Sw2-FM / HM-Sec-SC / HM-LC-Sw1PBU-FM / HM-SCI-3-FM / HM-Sec-Key / HM-RC-Key3-B / HM-LC-Dim1TPBU-FM /  HM-CC-RT-DN / HM-PBI-4-FM / HM-RC-Key4-2 / HM-ES-PMSw1-Pl / HM-LC-Sw4-WM

Dirk

Für Batteriebetriebene Schaltungen, wenn es auf das letzte µA ankommt, würde ich ohnehin hinter dem Spannungsregler vom Arduino versorgen. Und diesen und die Arduino-LED Hardwareseitig abklemmen. Der Spannungswandler Verbrät nämlich auch einiges. Mit einer LiPo-Zelle als Spannungversorgung klappt das natürlich nicht.

Für die Batteriemessung kannst du die Versorgungsspannung VCC als Referenz (Aref) des ADC reinstellen. Damit kannst du die interne Bandgapreferenz  messen und die resultierende Spannung ausmessen:
http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Die_Versorgung_muss_stimmen

ZitatDas heisst, wenn wir einen Arduino mit einem Lipo betreiben wollen, hilft das nicht weiter...
Für meine seit Jahren mit einer CR2450-Zelle laufenden FS20-Taster nutze ich einen Zusätzlichen Transistor um nach jedem Tastendruck den Spannungsteiler zur Batteriemessung zu aktivieren. Da kannte ich den Trick mit der internen Bandgapreferenz  noch nicht.
Das würde hier gehen. Braucht aber ein Paar zusätzlich Bauteile

ZitatBrown-Out sollte eigentlich im Power Mode 2-4 automatisch ausgeschaltet werden. Dazu gibts in der HM::power_poll folgendes Statement
Lässt sich Brownout auch über Register abschalten? ich hatte das immer mit den entsprechenden Fuse-Bits gemacht.

Dirk

Zitat
hast Du gesehen, er hat dort auch eine Schaltung mit einem Mosfet die gar keinen Strom verbraucht:
Genau so hatte ich das beim FS20-Taster gemacht.

Gruß
Dirk

trilu

Ich will ja nicht nur einen Schalter mit der Lib bedienen. Bei einem batteriebetriebenen Schalter, oder auch Sensor sollten wir sicherlich die interne Methode wählen.
Aber ich denke auch an die Einsatzmöglichkeit als Actuator, da brauchen wir vermutlich eine externe Möglichkeit.

Mir gefällt einfach die Lösung mit den zwei Widerständen und dem Kondensator, sowas bekomme ich auch aufs Steckbrett. Das mit dem Mosfet ist sicherlich eleganter :-)
Bei der Lösung mit den Widerständen kommt man rechnerisch auf 0,3uA - Selbstentladung von Lipo ist 1-3% pro Jahr, bei angenommenen 2000mAh sind das 2,2uA pro Stunde.

Mit der einfachen Widerstandslösung bleiben wir also unter der Selbstentladung ....

Der Bod lässt sich beim 328 über Fuse Bits ein und ausschalten, oder aber temporär vor dem Schlafen. Ich habe in der Lib den temporären Ansatz gewählt, da ich ja zur
Laufzeit nicht weiß ob er eingeschaltet ist. Beim temporären Ausschalten ist das egal, war er aus, bewirkt der Befehl nichts.
War er an, dann wird er nur beim Schlafen ausgeschaltet und beim Aufwachen wieder aktiviert...

Viele Grüße
Horst

trilu

@Dirk

ich habe mir heute mal die neue Version von 10_CUL_HM.pm aus dem trunk geholt. Anfangs hatte ich weiterhin Probleme mit dem getConfig.
Device aus der cfg gelöscht, Fhem neu gestartet und jetzt läuft es wie Butter...

Kannst ja mal testen

Viele Grüße
Horst

Dirk

ZitatDevice aus der cfg gelöscht, Fhem neu gestartet und jetzt läuft es wie Butter
Es sieht schon besser aus, Allerdings war der Start etwas "holprig".

Mit was für eine IDE arbeitest du eigentlich?
Die Arduinoe-IDE reicht zum Kompilieren und bissl zum Testen Zum richtigen Entwickeln ist diese IDE aber Sch...
Eclipse bekomme ich nicht zum Kompilieren.

Gruß
Dirk

trilu

Ich habe mir zum Start auch das dümmste Device ausgesucht. Ich habe letztens mal diesen PCB Schalter emuliert,  das ging deutlich besser...
Ich nutze das Atmel Studio 6.1 mit visual micro plugin.
Das geht ganz gut und hält den Code übersichtlich. Nutzt aber zum Kompilieren die Arduino Soft und somit sollte es ziemlich kompatibel sein.
http://visualmicro.codeplex.com

Dirk

Zitat von: trilu am 26 Dezember 2013, 15:34:34
Der Bod lässt sich beim 328 über Fuse Bits ein und ausschalten, oder aber temporär vor dem Schlafen.
Auch schön. Das hatte ich gar nicht gesehen.

Du hast da aber einen Fehler, daher bleibt der BOD an. Und das hate ich auch im Stromverbrauch gemessen.
Du muss den BOD so ausschalten:
MCUCR = (1<<BODS)|(1<<BODSE);
MCUCR = (1<<BODS);


Somit braucht der AVR bei mir nur noch 0,16 µA bei 3V

Ich versuche grade mal noch eine 2. Status-LED einzubauen
Ich würde bei mir nämlich gerne 2 Status-LED's (bzw. einen 2-Farbige) einsetzen.
Daraus könnten sich dann solche Statusanzeigen ergeben:
Beim Senden: Gelb (beide LED-Chips, rot und grün, sind an)
Beim ACK: Grün
Bei Fehler: Rot

Gruß
Dirk