Probleme mit der Firmware zur Justierung der Waage auf ESP8266

error: 'ARDUINO_VERSION' was not declared in this scope

In der IDE übersetzt mag es bestimmt funktionieren.

Hmm. also sowas könnte gehen (ohne Gewähr):

#if ARDUINO_VERSION <=106  
  void yield(void) {};
#endif
yield();

Die entsprechende Variable heißt im makeEspArduino.mk anders: ESP_ARDUINO_VERSION , das paßt vllt besser in eine #ifdef-Konstruktion; oben einfach ein ..106 || !ESP_ARDUINO_VERSION wird kaum gehen…

Das Problem hierbei war (warum das auch invers zur HX711 Bibliothek von bogde formuliert wurde), dass just diese Deklaration dort in Zusammenhang mit der Redeklaration im Userspace Code einen “Already declared” o.ä. Compilerfehler ausgelöst hatte, weil es ja bereits im HX711 Teil deklariert wurde. => Hirnverzwirnung… :-)

Deswegen klappt auch Dein erster Vorschlag vermutlich nicht, @weef.

Wir sollten das einfach weglassen, da auf Arduino Core für ESP8266 vermutlich heutzutage sowieso niemand mehr mit solchen alten Arduino Versionen arbeitet. Nur bei mir war das halt noch drauf - deswegen auch der PR gegen die HX711 Bibliothek.

Gut, die Abwärtskompatibilität für hier <1.0.6 können wir ohne Reue opfern.

Noch ein letzter Versuch, abwärtskompatibel zu bleiben:
https://github.com/hiveeyes/arduino/commit/a800aa19

Alexander Wilms wrote:

-Kalibrierungstemperatur (zur späteren Ermittlung der Abweichung)

Habe dazu einen eigenen Thread eröffnet:

Hallo @clemens , ich baue das hier gerade nach - ohne die Schaltung zur Messung des Akkuzustands, um die Parallelschaltung der vier Wägezellen damit auszuprobieren.
Es blinkt, der Wlan-client-Test ist o.k. und auch der Upload des Initialisierungs-Sketchs klappt. Aber das bringt dann nach dem Begrüßungsspruch und etwa drei Sekunden diesen “Soft WDT reset” und geht zurück in den bootload mode. So sieht das im Serial Monitor aus:

"#⸮⸮Scale Adjustment for Open Hive / HX711
--------------------------------------

>> Step 1: tare scale
   ------------------
   Remove all weight from the scale!
   (If done, input any character to continue ...)


Soft WDT reset

ctx: cont 
sp: 3ffefd30 end: 3ffeff70 offset: 01b0

>>>stack>>>
3ffefee0:  3fffdad0 3ffe892b 4020312c 3ffeef50  
3ffefef0:  3fffdad0 3ffeed18 00000000 402029e5  
3ffeff00:  4010679c 3ffeef1c 3ffeef1c 402022ca  
3ffeff10:  00002580 3ffeed18 3ffeef1c 402022e1  
3ffeff20:  feefeffe 3ffeed18 3ffeef1c 402023e6  
3ffeff30:  feefeffe feefeffe feefeffe feefeffe  
3ffeff40:  feefeffe feefeffe feefeffe 3ffeef40  
3ffeff50:  3fffdad0 00000000 3ffeef38 40203170  
3ffeff60:  feefeffe feefeffe 3ffeef50 40100108  
<<<stack<<<
c_⸮⸮c_⸮

Alles, was ich dazu finde im WWW, sind Hinweise auf die prekäre Stromversorgung und ich solle es mit einem Kondensator zwischen Vin und GRD probieren. Der FTDI-Adapter läuft im 5V-Betrieb vom USB des Laptops. Am VBat hängt ein Ladegerät mit 5V/1A.
Fällt dir dazu noch was ein?

Außerdem ist mir aufgefallen: Hier in der Beschreibung legst du DATA und CLK auf die Pins 12 und 14 und im Sketch sind sie auf 15 und 14 festgeschrieben. Was hat es damit auf sich?

Hi Markus,

hier schlägt mal wieder der Watchdog zu, es handelt sich also höchstwahrscheinlich um ein Softwareproblem. Wir haben damals schon die “serial_poll” Funktion fit für den ESP gemacht, aber vermutlich reicht es noch nicht ganz oder es hat sich irgendetwas geändert, vielleicht am Arduino SDK für den ESP?

Du müsstest in die Richtung schauen, wo das “yield” steht. Vielleicht kommt das einfach nicht mehr zum tragen, weil die define Konstanten nicht mehr greifen. Probier doch an dieser Stelle etwas rum.

Edit: Schau doch auch mal hier bei @Alex:

Neben dem “yield” füttert er den Watchdog auch noch per “ESP.wdtFeed”. Vielleicht hilft Dir das weiter.

Viele Grüße,
Andreas.

@mois! Bei mir funktioniert der Justierungs-Sketch auch nicht! :-/ Mein ursprünglicher Sketch tut nicht - der vor einiger Zeit noch mit anderer Arduino IDE und / oder anderem ESP core lief - und auch der von Andreas modifizierte tut nicht.

Warum die Pinbelegung anders ist, kann ich gerade nicht nachvollziehen, einfach das eintragen, was du nimmst. Vielleicht habe ich auch für den breadboard-Aufbau und dann für die Platine andere Pins verwendet.

Es hängt vermutlich an der Seriellen Schnittstelle. Komischerweise habe ich auf die Schnelle bisher keinen aktuellen sketch gefunden, der mit dem ESP über den Arduin-core Daten der Seriellen einliest. Denke wenn wir da ein working example haben, haben wir auch die Lösung für unseren Sketch.

vielen dank für eure schnellen antworten.

  1. peinlich für mich, dass ich diesen thread nicht selbst gefunden habe hier. danke fürs verschieben!

  2. ESP.wdtFeed(); hier nach yield(); mit eigener zeile (285) hinzugefügt und: es funktioniert!

8} … oh, bitte, danke! Schön, daß es sich löste!

Zwei pull requests dazu allein in der bogde-lib:

https://github.com/bogde/HX711/pull/86/commits/007787788c275066b50bce7e7b50eb54e269b85e

Es scheint also, als wenn sich im esp8266-SDK ab 2.4.0 yield() und delay(0) nicht mehr identisch verhalten würden in bezug auf das Updaten der system tasks…

Der zweite PR adressiert das gleiche Problem, allerdings etwas ‘hölzerner’:

https://github.com/bogde/HX711/pull/81/files

Das hier ist etwas hohl (nicht, weil er unseren commit verwirft, sondern), weil es nicht universell genug ist:

-#if ARDUINO_VERSION <= 106
+#ifndef ARDUINO_ARCH_ESP8266

Dem contributor muß man zugute halten, daß er immerhin hinschreibt:

I have tested this on the ESP8266, but I did not check if it has
any side effects for other boards.

… typisches “works for him”… ;(
Aber dieser PR ist auch bislang nicht angenommen worden.

Dennoch merkwürdig:

I can attest that yielding momentarily returns execution flow to the underlying scheduler, which feeds the watchdog as part of it’s operation :)

(https://github.com/esp8266/Arduino/issues/34#issuecomment-356305462 ; 9.1.2018)

Noch drei Gedanken dazu:

  • ARDUINO_ARCH_ESP8266 verwenden wir (im Makefile) ebenfalls; wir könnten also von dieser Variable abhängig machen, was für eine 'feed the puppy"-Funktion verwendet werden soll:
  • wenn Du, @mois, gerade noch dran bist: dann ersetze doch bitte einmal testweise ESP.wdtFeed() mit delay(0) und berichte mal, ob das dann auch funktioniert.

  • ESP.wdtFeed() füttert beide watchdogs - siehe message sequence chart in Arduino/readme.md at master · pasko-zh/Arduino · GitHub
    Daher ist der Name der darunterliegenden Funktion system_soft_wdt_feed() irreführend (sowie derjenige der zwei anderen func mit system_soft_wdt_-Präfix).

1 Like

ja, funktioniert auch.

in einem weiteren versuch hab ich die yield-zeile auskommentiert, so dass nur noch die delay-zeile wirkt.
funktioniert auch.


Nachtrag einige Stunden später: Leider krieg ich keine plausiblen Justierungswerte.
Ich werde den Nullwert und einen halbwegs plausiblen kilo-Wert eben per try&error im eigentlichen Sript justieren falls hier niemand eine bessere Idee hat.
Der Waagentyp (4 Zellen parallel) sollte hier keine Rolle spielen, oder? Grundsätzlich auf halbwegs plausibles Waagenverhalten justieren sollte sich das lassen. Wie genau das dann am Ende wird, war lediglich die die Frage, oder?

1 Like

Habe den sketch nun auch gerade am laufen mit 4 parallelen Zellen. Montiert sind die etwas genaueren und teureren LCT LAB-H-C3, siehe den China-Load-Cell-Thread. Meine Rohwerte sind gerade alle negativ und werden mit mehr Gewicht auch nicht höher (Richtung positiver Bereich), sondern mehr negtiv.

Messwerte gefallen mir noch nicht, aber dafür sollten wir den anderen Thread nutzen.

Datum/Zeit,Gewicht,Aussen-Temperatur,Aussen-Feuchtigkeit,Brut-Temperatur,Spannung
2018/02/25 23:37:33,   5.423, 20.7, 49.3, 20.8, 5.45
2018/02/25 23:38:31,   5.433, 20.7, 49.6, 20.8, 5.45
2018/02/25 23:40:26,   5.460, 20.7, 49.6, 20.8, 5.44
2018/02/25 23:42:22,   5.470, 20.7, 49.6, 20.8, 5.43
2018/02/25 23:44:19,   5.476, 20.7, 49.6, 20.8, 5.36
2018/02/25 23:46:15,   5.479, 20.7, 49.5, 20.8, 5.44
2018/02/25 23:48:12,   5.481, 20.7, 49.6, 20.8, 5.42
2018/02/25 23:50:09,   5.486, 20.7, 49.7, 20.8, 5.44
2018/02/25 23:52:05,   5.486, 20.7, 49.4, 20.8, 5.42
2018/02/25 23:54:02,   5.486, 20.6, 49.3, 20.8, 5.42
2018/02/25 23:55:59,   5.487, 20.7, 49.7, 20.8, 5.42
2018/02/25 23:57:55,   5.488, 20.7, 49.7, 20.8, 5.43
2018/02/25 23:59:52,   5.486, 20.7, 49.8, 20.8, 5.41

Was ist dein Problem mit dem Justierungs-Sketch? Normalerweise sollte das so funktionieren

  1. Sketch starten, ggf. reset am ESP drücken.
  2. Alles Gewicht von der Waage entfernen.
  3. Irgend etwas in die serielle eintippen, dann return drücken.
  4. Nun liest der Sketch die Rohwerte für unten / Nullpunkt / Tara.
  5. Da die Wägezellen bei einer Justierung im Bereich der negativen Rohwerten bis zu positiven nicht so ganz linear reagieren habe ich den nächsten Schritt noch eingefügt, der manchen verwirrt. Hier kann man ein beliebiges Gewicht auf die Waage legen und dann den unteren Wert nochmals extra bestimmen. Normalerweise ist der untere Wert gleich dem Nullpunkt, d.h. identisch mit dem zuerst ermittelten. Man kann hier auch einfach nichts auf die Waage legen und das gleiche Spiel wie oben nochmal machen, sprich …
  6. … irgendetwas in die serielle eintippen, dann return drücken.
  7. Nun liest der sketch den unteren Wert zur bestimmung des kgDividers ein.
  8. Jetzt legt man – zusätzlich zu dem Gewicht das ggf. schon auf der Waage ist – einen Gegenstand von dem man das Gewicht kennt, z.B. 5 TetraPacks Milch mit einem Gewicht von 5.423 g.
  9. Nun muss genau dieser Gewichtswert in Gramm der seriellen Schnittstelle mitgeteilt werden man tippt also 5423 ein und drückt return.
  10. Danach wird der ober obere Wert bestimmt und anschließend die Kennwerte für loadCellZeroOffset und loadCellKgDivider ermittelt. Diese kopiert man dann von der Ausgabe der Seriellen Schnittstelle in den eigentlichen Sketch und lädt diesen hoch.
1 Like

das hatte ich so nicht verstanden. ich hab bisher das in step 2 aufgelegte gewicht mithinzugerechnet.
mal sehen ob ich so jetzt bessere werte kriege…

apropos eigentlicher sketch: der läuft einmal tipptopp durch und stirbt dann unmittelbar nach dem wiederaufwachen. kennst du das?

wenn ich danach am aufgelegten gewicht (in meinem fall 2555g ontop der in step 2 aufgelegten 2804g) nichts mehr ändere und nochmal ein zeichen losschicke, misst er ja mit den ermittelten werten still vor sich hin, sollte also etwa 5359 (die gewichte aus step 2 und 3 zusammengezählt) auswerfen. tut er aber nicht. stattdessen meldet er so um die 5900g. das meine ich mit unplausibel.

Nachtrag ca. 20 minuten später: Jetzt sind wir hier schon bei nur noch 5750g im Schnitt. Ich stelle also eine Tendenz in Richtung des zu erwartenden Wertes fest. War ich zu ungeduldig? Müssen sich die jungfräulichen Zellen erst einbiegen? Den Effekt gabs ja mit den großen Zellen auch. Dann wäre ich begeistert von dieser Justierungsmöglichkeit. - Bin ich sowieso schon, wenn ich recht überlege, denn die Größenordnung stimmt ja auf jeden fall schon mal :-)

hier mal noch mein serial monitor mit in kommentaren dem jeweils aufgelegten gewicht:

>> Step 1: tare scale
   ------------------
   Remove all weight from the scale!
   (If done, input any character to continue ...)

Get raw values for tare: 
30829
30736
30762
30687
30681
30663
30695
30787
30794
30897

Low 	Avg 	Med 	High 	Diff
30663	30753	30749	30897	-234

>> Step 2: weight lower limit
   --------------------------
   Load at least 1 kg to the scale so that the raw values are > 0!   // 2804g loaded
   (If done, input any character to continue ...)

Get raw values for lower limit: 
41389
41105
39704
42494
38649
39804
40640
40532
40433
40440

Low 	Avg 	Med 	High 	Diff
38649	40519	40486	42494	-3845

>> Step 3: weight upper limit
   --------------------------
   Put a known load on the scale! ...  // 2555g added to the load
   ... and input weight in gram ...

Get raw values for upper limit "2555 g":
47674
47688
47711
47644
47610
47636
47636
47608
47578
47428

Low 	Avg 	Med 	High 	Diff
47428	47621	47636	47711	-283

>> Done! Your calculated parameters:
   ---------------------------------

   loadCellZeroOffset: 30749
   loadCellKgDivider:  2798
   ---------------------------------

You can test your calculated settings now!
(Input any character to continue ...)

..........
Low 	Avg 	Med 	High 	Diff
5.880	5.935	5.934	5.989	-0.109

..........
Low 	Avg 	Med 	High 	Diff
5.868	5.935	5.946	6.004	-0.135

..........
Low 	Avg 	Med 	High 	Diff
5.945	5.976	5.980	6.023	-0.077

..........
Low 	Avg 	Med 	High 	Diff
5.893	5.950	5.940	6.009	-0.116

Ne, kan ich so nicht sagen, was meinst du mit “stirbt” irgendwelche debug-Infos, die automaitsch rausgeschickt werden?

Also erst mal durchlaufen lassen, dann mit 2804 g zuerst beschwert und dann nochmal 2555 g zusätzlich, ja? Bei der Eingabe des Gewichts hast du jetzt 2555 eingegeben? Dann sollten eigentlich 5359 am Ende angezeigt werden. Bei mir bewegt sich das auch etwas über die Zeit – siehe oben, später wurde es weniger – aber eher im hundertstel statt im zehntel-Bereich. Hast du die Gewichte vertauscht oder das falsche eingegeben?

Ich glaube, du nennst es an einer Stelle “sleep garbage”. das kommt noch auf dem Serial Monitor wenn Zeit ist zum aufwachen, 7 oder 8 Zeichen oder so und dann eben nichts mehr. Auf dem ESP geht das Lichtchen für den bootmode an, er ist aber nicht flashbar. Ich muss den bootmode erst durch die tasterkombination herbeiführen.

Das beruhigt mich. Gewichte bin ich mir ziemlich sicher, dass ich die richtig aufgelegt und eingegeben habe. Habs oft genug gemacht ;-)
Die Tendenz geht tatsächlich leicht pendelnd weiter in Richtung des Erwartungswerts, hier die Werte der letzten 20 Minuten:

..
Low 	Avg 	Med 	High 	Diff
5.413	5.474	5.463	5.547	-0.134

..........
Low 	Avg 	Med 	High 	Diff
5.520	5.540	5.539	5.558	-0.039

..........
Low 	Avg 	Med 	High 	Diff
5.537	5.571	5.558	5.656	-0.119

..........
Low 	Avg 	Med 	High 	Diff
5.597	5.655	5.662	5.696	-0.099

..........
Low 	Avg 	Med 	High 	Diff
5.586	5.613	5.608	5.652	-0.066

..........
Low 	Avg 	Med 	High 	Diff
5.594	5.626	5.619	5.677	-0.083

..........
Low 	Avg 	Med 	High 	Diff
5.635	5.670	5.673	5.695	-0.060

..........
Low 	Avg 	Med 	High 	Diff
5.595	5.663	5.670	5.688	-0.092

..........
Low 	Avg 	Med 	High 	Diff
5.556	5.602	5.612	5.640	-0.084

..........
Low 	Avg 	Med 	High 	Diff
5.535	5.567	5.556	5.621	-0.086

..........
Low 	Avg 	Med 	High 	Diff
5.444	5.550	5.582	5.613	-0.169

..........
Low 	Avg 	Med 	High 	Diff
5.438	5.532	5.543	5.588	-0.150

..........
Low 	Avg 	Med 	High 	Diff
5.498	5.564	5.578	5.591	-0.093

..........
Low 	Avg 	Med 	High 	Diff
5.552	5.583	5.592	5.612	-0.060

..........
Low 	Avg 	Med 	High 	Diff
5.504	5.557	5.546	5.637	-0.133

..........
Low 	Avg 	Med 	High 	Diff
5.419	5.484	5.489	5.551	-0.132

..........
Low 	Avg 	Med 	High 	Diff
5.486	5.529	5.532	5.572	-0.086

..........
Low 	Avg 	Med 	High 	Diff
5.554	5.580	5.584	5.607	-0.053

..........
Low 	Avg 	Med 	High 	Diff
5.531	5.569	5.577	5.617	-0.085

..........
Low 	Avg 	Med 	High 	Diff
5.493	5.531	5.529	5.571	-0.078

..........
Low 	Avg 	Med 	High 	Diff
5.376	5.440	5.455	5.491	-0.114

..........
Low 	Avg 	Med 	High 	Diff
5.377	5.410	5.413	5.438	-0.060

..........
Low 	Avg 	Med 	High 	Diff
5.297	5.376	5.382	5.476	-0.179

..........
Low 	Avg 	Med 	High 	Diff
5.287	5.311	5.313	5.333	-0.046

..........
Low 	Avg 	Med 	High 	Diff
5.285	5.312	5.311	5.345	-0.060

..........
Low 	Avg 	Med 	High 	Diff
5.269	5.296	5.292	5.329	-0.060

..........
Low 	Avg 	Med 	High 	Diff
5.259	5.304	5.303	5.384	-0.125

..........
Low 	Avg 	Med 	High 	Diff
5.403	5.442	5.446	5.465	-0.062

..........
Low 	Avg 	Med 	High 	Diff
5.445	5.519	5.527	5.556	-0.111

..........
Low 	Avg 	Med 	High 	Diff
5.541	5.579	5.583	5.608	-0.066

......

Ich lass das jetzt einfach mal über Nacht laufen und melde morgen abend oder nacht nochmal den Stand der Dinge.

Gute Nacht :-)

Das ist aber normal, wenn du die Serielle auf – ich glaube es waren 115200 umstellst wurd der vermeintliche “Müll” als debug-Text des Systems ausgegeben.

Ich habe den Adafruit Huzzah, hier dimmt die rote LED etwas. Das ist aber nciht der boot mode!! sondern reverse current. Muss man entweder mit einem Widerstand verhindern oder man “deaktiviert” die LED einfach, was ich gerade gemacht habe. Bootloader muss ich immer mit dem Druck auf beide Taster des Huzzah vorbereiten.