Der ADC des ESP8266 liefert keine guten Ergebnisse, wenn das Funk-Modul aktiv ist. Die Ausgaben sind relativ instabil und haben hohe Schwankungen. Sowohl das Datenblatt als auch die FAQ weisen hierauf hin. Hier einige Beispiel-Messreihen (Rohdaten am Ende der Seite):
Gemessen wurde mit einem NodeMCU (ESP12) an einem aktiven USB-Hub. Die vom NodeMCU bereitgestellte, gesiebte Versorgungsspannung von 3,3 V wurde mit einem Spannungsteiler von 5,4:1 (440k+100k Widerstände) an den ADC-Eingang (TOUT) gelegt. Es wurden 512 Messungen im Abstand von jeweils ca. 1 ms durchgeführt. In der Grafik sind vier Messreihen aufgeführt.
Selbst, wenn man den großen Ausreißer (Wert 511) bei Messwert #32 unberücksichtigt lässt, liegen immer noch Schwankungen von 5 Punkten vor (Werte zwischen 585 und 590):
Es ist müßig, darüber nachzudenken, wo genau die Glitches her rühren. Ich denke, die Messumgebung spiegelt relativ reale Bedingungen wieder. Bessere Werte wird man erhalten, wenn man das Gerät mit Batteriestrom versorgt, die Stromversorgung für den Analog- und den Digital-Teil trennt und den Funk-Teil abschaltet (s. Dokumentationen zu system_adc_read()in den Espressif-Handbüchern). Aber, wer will das schon?
Man kann einiges per Software bereinigen, insbesondere die Ausreißer herausfiltern. Der erste Schritt wäre einfach den Mittelwert aus mehreren Messungen zu verwenden. Hier bietet sich an, entweder 5-10 Messungen zu machen und daraus entweder den Durchschnitt oder, wenn man fortlaufende Messungen vornimmt, den gleitenden Durchschnitt zu verwenden.
Der einfache Mittelwert hilft aber nur wenig gegen große Ausreißer. Die zwingen auch den Mittelwert in die Knie. Bessere Ergebnisse erhält man, wenn vor der Mittelwert-Bildung die Ausreißer eliminiert. Dies geht am einfachsten, wenn man einfach den jeweils kleinsten und größten Wert unberücksichtigt lässt. Die folgende Messreihe aus 200 Punkten basiert auf genau diesem Verfahren. Es wurden für jeden Messpunkt 6 Proben per system_adc_read() gezogen, der kleinste und größte Wert verworfen und er Mittelwert aus den verbleibenden 4 Werten berechnet.
Das Ergebnis zeigt die folgende Grafik:
Bis auf einen Messpunkt schwanken die Werte nur noch um eine Stelle.
Wenn man den Wert zur Anzeige verwenden will, nerven aber selbst diese kleine Schwankungen. Die Anzeige würde im Beispiel dauernd zwischen 588 und 599 wechseln. Wenn 588 gerade ein Grenzwert wäre, dessen Überschreitung irgendetwas auslösen würde, z.B. einen Nachrichtenversand, dann würde man dauern Nachrichtern erhalten :-). Runden hilft ein wenig, verschiebt das Problem aber eigentlich nur auf die Rundungsgrenzen.
Die Lösung heißt Hysterese. Konkret heißt das: Um den letzten Messwert herum wird ein Fenster definiert. Der Messwert wird erst dann erneuert, wenn wenn ein neuer Messwert dieses Fenster verlässt. Dieser neue Messwert ist dann die wieder Basis für das neue Fenster.
Wendet man dieses Verfahren mit der Hysterese-Wert 3 auf die vorhergehende Messreihe an, liegt der Output konstant bei 589. Den kann man dann auch gut zeigen. Der Form halber die entsprechende Grafik (das muss einfach sein! Auf die Angabe der Rohdaten habe ich verzichtet):
Das Ganze habe ich als Bibliothek UrsADC mit Klasse UrsADCClass und der zugehörigen Instanz UrsADC implementiert.
Die Bibliothek stellt die Instanz UrsADC der Klasse UrsADCClass zu bereit. Das Wichtigste ist die Methode read(), über die aufbereite ADC-Readings abgerufen werden können. Im einfachsten Fall liefert UrsAdc.read() den nächsten aufbereiteten Messwert des ESP8266-internen ADC.
Die weiteren Methoden dienen zur Konfiguration des Aufbereitungsalgorithmus.
Zunächst werden direkt aufeinander folgend ADC-Auslesungen (Anzahl = Samples, einstellbar über setSampleCount()) vorgenommen und zwischengespeichert. Der kleinste und der größte Wert werden verworfen und aus den verbleibenden (Anzahl = Samples - 2) der Mittelwert gebildet (abrufbar über getLastValue()).
Passt dieser Mittelwert in das durch (LastCommitedValue (=vorhergehender Wert) ± Hysteresis gebildete Fenster, wird der vorhergehende Wert (LastCommitedValue) zurückgeliefert, d.h. der bereits beim letzten Aufruf zurück gelieferte Wert. Wird das Fenster verlassen, wird der neue Wert zurückgeliefert und ist die Basis für das Hysterese-Fenster des nächsten Aufrufs von read(). Das Hysterese-Fenster kann durch setHysteresis() eingestellt werden.
Das o.a. Hysterese-Verfahren hat den Nachteil, dass es schwierig ist, den Wert 0 zu erreichen. 0 kann nur dann erreicht werden, wenn der vorhergehende Wert > Hysteresis war und der neue Messwert exakt 0 ist. Ansonsten bleibt immer ein kleiner Wert bestehen, auch dann wenn der gemessene Wert wirklich 0 ist. Das ist unschön!
Deshalb ist eine Sonderbehandlung für kleine Werte eingebaut. Liegt der neue Messwert unterhalb der Hysterese-Schwelle (0 + Hysteresis ) wird er auf 0 gesetzt. Er kann diesen Wert (0) erst wieder verlassen, wenn der neue Messwert > 1,5 * Hysteresis ist. Das sichert ab, dass die Anzeige bei Schwankungen um den Wert Hysteresis herum nicht permanent wechselt. Ob dieses verfahren zum Einsatz kommt, kann über setSpecialZeroTreatment() festgelegt werden.
Mögliche Optimierung: Ein von Hysteresis unabhängiger Schwellwert (ZeroThreshold) für die Sonderbehandlung von 0.
Funktion | Beschreibung | Anmerkung |
---|---|---|
UrsAdc | Statische Instanz der UrsAdcClass-Klasse. |
Dieses Objekt kann direkt zur ADC-Messung verwandt werden. Es besitzt folgende Einstellungen:
|
UrsAdcClass() | Konstruktor, initialisiert eine neue Instanz der UrsAdcClass-Klasse. | Der Konstruktor führt ein initiales read() aus. Dieses erste read() dauert i.d.R. etwas länger als folgende. Wahrscheinlich werden zusätzlich einige Initialisierungen durchgeführt. |
uint16_t read(); | read() liefert die nächste aufbereite ADC-Messung. | Algorithmus s.o. Bespiel:
|
void setSampleCount(uint8_t Value) uint8_t getSampleCount() |
Ruft die Anzahl der Messwerte fest, aus denen das Ergebnis gemittelt wird, oder legt sie fest. | Minimum ist 3, Maximum ist 16, Voreinstellung ist 6. Der Wert 6 bedeutet: Zur Messwertaufbereitung werden 6 direkt aufeinanderfolgende Messungen durchgeführt (system_adc_read()). Nach dem Verwerfen des niedrigsten und des höchsten Messwerts wird aus den verbleibenden 4 Werten der Mittelwert gebildet. Bei dieser Einstellung dauert ein Messzyklus im Schnitt knapp 600µs. Gelegentlich werden auch knapp 700µs benötigt, wahrscheinlich weil Netzwerk-Operationen dazwischen kommen. |
void setHysteresis(uint16_t Value) uint8_t getHysteresis() |
Ruft die Hysterese zur Glättung der Messwerte ab oder legt sie fest. | Minimum ist 0, Maximum ist 64, Voreinstellung ist 3. Das Hysterese-Verfahren kann ausgeschaltet werden, indem der Wert auf 0 gesetzt wird. Der Wert von 3 bedeutet, dass der zuletzt ermittelte Basis-Wert zurückgeliefert wird, solange der neue Messwert sich nicht um 3 (+ oder -) vom Basis-Wert unterscheidet. Ist die Differenz zum Basis-Wert größer als 3, wird der neue Messwert zurückgeliefert und dient gleichzeitig als neuer Basis-Wert. |
void setSpecialZeroTreatment(bool Value) uint8_t getSpecialZeroTreatment() |
Ruft ab, ob eine Sonderbehandlung für 0-Werte erfolgt oder legt dies fest. | Algorithmus s.o |
uint16_t getLastValue() | Ruft den letzten teilweise aufbereiteten Messwert ab. | Ausreißer wurden eliminiert und Mittelwert gebildet. Keine Anwendung der Hysterese und keine Sonderbehandlung der 0. |
Das folgende (simple) Beispiel ermittelt ca. jede Sekunde den ADC-Messwert und gibt ihn über die serielle Schnittstelle aus. Die Zeit für die ADC-Wandlung ist nicht vernachlässigbar. Wenn die Zeitabschnitte zwischen den Messungen genauer sein sollen, muss ein Timer verwand werden (s. Ullis Roboter Seite: ESP8266-Timing).
loop()
{ Serial.print("Aktueller ADC-Input:");
Serial.prinmtln(UrsAdc.read());
delay(1000); // 1 Sekunde warteschleife
}
Das ZIP-Archiv für Bibliothek UrsAdc zum Download. Die entpackten Dateien ins Verzeichnis <user>\Documents\Arduino\libraries kopieren (siehe Installing Additional Arduino Libraries).
Das Archiv enthält die Bibliotheksdateien
Von Interesse ist eigentlich nur die Methode read().
// Mittelt ADC-Werte zur besseren Stabilität der ADC-Reading.
// Es werden Samples aufeinanderfolgende Messwerte aufgenommen
// Der jeweils höchste und niedrigste wird verworfen.
// Der Messwert ist der Mittelwert aus den Samples-2 verbliebenen Werten.
// Der Messwert wird anschließend gegen die eingestellte Hysterese geprüft.
uint16_t UrsAdcClass::read()
{ // ADC-Werte einlesen, in TempValues[] zwischenspeichern, Min und Max ermitteln
for (uint8_t i = 0; i < Samples; i++)
{ uint16_t v = system_adc_read();
TempValues[i] = v;
if (v > MaxVal) // Maximum merken
{ MaxVal = v; // Wert
MaxInd = i; // Index
}
if (v < MinVal) // Minimum merken
{ MinVal = v; // Wert
MinInd = i; // Index
}
} // for
if (MinInd == MaxInd) // Alle Werte identisch
LastValue = MinVal;
else
{ uint16_t sum = 0;
for (uint8_t i = 0; i < Samples; i++)
{ if (i == MaxInd) continue;
if (i == MinInd) continue;
sum += TempValues[i];
} // for
LastValue = sum / (Samples-2);
} // else
uint16_t top = LastCommitedValue + Hysteresis; // obere Schranke
if (SpecialZeroTreatment) // Sonderbehandlung für 0.
if (LastCommitedValue == 0)
top += Hysteresis / 2; // 1,5-facher Wert für die Hysterese
uint16_t bot = 0; //untere Schranke.
if (LastCommitedValue > Hysteresis) // Wegen uint16_t bei der Subtraktion aufpassen!
bot = LastCommitedValue - Hysteresis; // sonst 0.
if ((int32_t)LastValue > top || (int32_t)LastValue < bot)
LastCommitedValue = LastValue;
if (SpecialZeroTreatment) // Sonderbehandlung für 0.
if (LastCommitedValue < Hysteresis)
LastCommitedValue = 0;
return LastCommitedValue;
}
Reihe 1: 589, 588, 589, 589, 589, 589, 589, 589, 589, 590, 586, 586, 586, 586, 585, 585, 585, 585, 585, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 586, 589, 588, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 590, 589, 589, 589, 589, 589, 589, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 590, 590, 589, 589, 589, 589, 589, 589, 585, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 589, 589, 589, 589, 589, 590, 589
Reihe 2: 589, 589, 589, 589, 589, 589, 589, 589, 585, 585, 585, 585, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 585, 585, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 585, 585, 585, 588, 588, 589, 589, 589, 586, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 588, 589, 585, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 588, 589, 588, 588, 588
Reihe 3: 589, 588, 588, 588, 588, 589, 585, 585, 585, 585, 585, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 589, 585, 585, 585, 585, 588, 588, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 589, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 590, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 589, 588, 589, 588, 588, 589, 589, 590, 585, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 589, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 589, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 588, 589, 589, 588, 589, 588, 588, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 589, 588, 588, 588, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 588, 588, 588, 588, 588, 588, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 589, 588, 588, 588, 588, 588, 589
Reihe 4: 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 590, 590, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 586, 586, 586, 586, 586, 511, 586, 585, 585, 588, 588, 588, 589, 589, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 590, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 586, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 590, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 590, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 590, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 590, 590, 590, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 590, 589, 589, 588, 588, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 590, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589
589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 587, 587, 588, 588, 588, 589, 589, 589, 589, 589, 589, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 588, 588, 589, 589, 589, 589, 589, 589, 589, 589, 588, 589, 589, 588, 589, 589, 589, 589, 589, 589, 589, 589, 589, 588, 588, 588, 588, 589