Regenmesser Basisversion - Teil 1 - AZ-Delivery

Dit bericht is ook als PDF-document beschikbaar.

 

Hoewel er een hele reeks sensoren beschikbaar is om temperatuur, vochtigheid, luchtdruk, verlichtingssterkte te meten... moeten we in de gereedschapskist graven om een ​​sensor voor neerslag te bouwen. Het is eenvoudigweg een kwestie van het registreren van relatief kleine hoeveelheden vloeistoffen, die geen continue stroom vertegenwoordigen, maar in de ware zin van het woord in druppeltjes verschijnen. Deze druppels moeten worden opgevangen. Wanneer het potje gevuld is met druppels, moet het automatisch geleegd worden en moet dit proces geregistreerd worden. Ik heb het principe gekopieerd van commerciële apparaten op internet. Er is een schudder met twee kommen gemonteerd zodat deze eenvoudig kan worden gedraaid en gekanteld wanneer een bepaald vulniveau wordt bereikt. Dit kantelproces moet nu door geschikte sensoren worden geregistreerd. Hoe het ging, inclusief verkeerde afslagen, ontdek je in de volgende afleveringen van de serie

 

MicroPython op de ESP32 en ESP8266

 

Vandaag [1] 

 

De ESP32 als regenmeter – Deel 1

In de aflevering van vandaag verzorgen we de werking van het project, bekijken we hoe reed-contacten werken en creëren we een eerste klein testprogramma dat we in de volgende twee afleveringen zullen uitbreiden. Om dit te doen, gebruiken we de trukendoos van MicroPython. Je leert over interrupts, contactbounce en hoe je dit programmatisch kunt uitschakelen. Ten slotte zullen we de bestanden met de gemeten waarden via FTP met behulp van threading-technologie naar de pc overbrengen.

 

mechanica

De wip

De sensor voor het meten van de hoeveelheid regen is een wip met twee bakken.

 

Figuur 1: Basisgedeelte van het apparaat

Hier is de rocker al in het onderste deel van de meetbuis geïnstalleerd. Ik gebruikte een afdekking van een PVC-rioolbuis van 100 gauge. Er zijn twee openingen gezaagd zodat het water weg kan lopen.

 

Figuur 2: Regenwippatroon

Figuur 2 toont het patroon van de rocker, gemaakt van 2 mm plexiglas. Het 1:1-sjabloon in de vorm van een PDF-bestand, kan worden gedownload. Voor het lijmen heb ik PLEXIGLAS®-lijm “Acrifix 192” gebruikt. Het vult gaten op en hardt uit onder UV-licht of gewoon daglicht. De sjabloondelen heb ik met een wateroplosbare lijmstift op het acrylglas gelijmd. Na het zagen en boren verwijder je het papier eenvoudig weer. Vergeet niet de te lijmen plekken schoon te maken met aceton of isopropanol.

 

De positie van het 1,5 mm gat voor de as gemaakt van 1,4 mm koperdraad (de as mag niet roesten, gebruik dus geen ijzer) bepaalt hoe gemakkelijk de tuimelaar kantelt. Dit neemt toe naarmate het gat zich hoger boven de grond bevindt. Ik gebruik het bovenste gat en krijg een capaciteit van ca. 2,4 cm³ tot de tuimelaar omvalt. We zullen later bekijken hoeveel regen dit betekent, afhankelijk van het gebied.

 

Wat kun je verkeerd doen? De resolutie van de volumemeting is beter als de wip zo licht mogelijk is. Gebruik dus zo dun mogelijk materiaal en zo min mogelijk lijm. Mijn eerste poging om de rocker uit blik of koperplaat te maken was een totale flop. Het volume van de kuipen was niet voldoende om de wip te doen omvallen, omdat de constructie veel te zwaar was.

 

De ophanging van de rocker is eveneens van acrylglas. De zijpanelen worden op de 6 mm dikke bodemplaat geschroefd zodat het ding uit elkaar kan worden gehaald. De afmetingen zijn te vinden in Figuur 3.

 

Figuur 3: Tuimelbeugel

 

Om te voorkomen dat de rocker tegen de zijwanden schuurt, heb ik er kleine plexiglas schijfjes tussen geplaatst.

 

Figuur 4: Rocker vanaf de zijkant

 

Figuur 5: Wip, gezien vanuit het noordoosten

 

Om de neerslag gericht in de bakken te laten belanden, moet deze over een gebied van bekende grootte worden opgevangen en via een trechter naar net boven de wip worden geleid. Uiteraard mag slechts één van de twee helften tegelijk worden gevuld. Er zijn drie dingen waarmee u rekening moet houden.

 

       De kuipen moeten breed genoeg zijn, zodat er niets misgaat.

       De bovenrand van de scheidingswand moet ver genoeg verwijderd zijn van de vallijn van de waterdruppels.

       En omdat grote trechters meestal dikkere uitlaatbuizen hebben, moest ik het mondstuk van een siliconenpatroon gebruiken om een ​​dunnere uitlaat te creëren. Het mondstuk werd eenvoudig met siliconen in de trechter gelijmd.

 

Een rioolbuis van 100 mm die de trechter ondersteunt, is op lengte gezaagd zodat de trechter in de juiste positie kan worden geplaatst. Figuur 5 toont de drie componenten van de mechanica.

 

Figuur 6: De mechanische onderdelen van de regenmeter

 

Zo ziet het voltooide apparaat eruit. De opening in de buis maakt controle mogelijk bij het nauwkeurig uitlijnen van de trechter. Indien nodig kan het uitgezaagde stuk voorzien worden van scharnieren en gebruikt worden als deur.

 

Figuur 7: Meetstation gemonteerd

 

Kantelbeweging registreren

Laten we eens kijken naar de bepaling van de kantelbeweging. Uit metingen met een pipet is gebleken dat de schudder naar rechts en links kantelt met iets verschillende vulhoeveelheden, 2,4 cm³ en 2,5 cm³. Deze omstandigheid was kennelijk het gevolg van een ongelijkmatige lijmaanbrenging of andere asymmetrieën. Beide stabiele eindposities moesten dus detecteerbaar zijn. Aanvankelijk was ik van plan een MPU6050-versnellingsmeter te gebruiken in de vorm van een GY 521-module. De vier benodigde kabels hinderden echter zoveel met het kantelen van de rocker, dat ik daar van moest afzien. Reflecterende lichtschermen waren voor mij te omvangrijk en daarom heb ik uiteindelijk reedcontacten gebruikt.

 

Dit zijn kleine, magnetisch bediende schakelaars in een glazen buisje van 2 x 13 mm. Het gemeenschappelijke aan deze dingen zijn de stijve verbindingsdraden. Ik heb vier van de contacten gedood, want als je het te dicht bij het glas buigt, zal het onmiddellijk versplinteren en het onderdeel doden.

 

Figuur 8: Reedcontact

 

Uiteindelijk is het ons gelukt om twee dingen met tweecomponentenplamuur aan één zijwand van de houder te bevestigen. Ziet er wild uit, maar werkt goed. Het is het beste om de lijn op dezelfde manier te bevestigen.

 

Figuur 9: Locatie van contacten en magneet

 

Op de rocker (Acrifix) wordt een kleine neodymium schijfmagneet geplakt en de contacten worden overeenkomstig deze positie uitgelijnd. Figuur 10 illustreert hoe de reed-contacten werken en legt uit waarom dit type magneet niet precies vóór het contact mag worden geplaatst.

 

Figuur 10: Hoe een reedcontact werkt

 

Het contact is open buiten magnetische velden (1). De contactveren zijn gemaakt van ferromagnetisch materiaal, waarschijnlijk ijzer of een overeenkomstige legering. De polen van een schijfmagneet zitten op de snijvlakken. Als je het reedcontact nadert, wordt de ijzerdraad (onderkant) door magnetische invloed een magneet (zuidpool) en trekt de tweede contactveer aan. Het contact sluit (2).

 

Als je de schijfmagneet centraal onder het contact zou schuiven, worden soortgelijke polen in de veren beïnvloed. Omdat ze elkaar afstoten kan het contact niet sluiten (3).

 

Kleine staafmagneten kunnen direct parallel aan het contact worden geplaatst. Doordat dan verschillende polen in de contactveren worden beïnvloed, sluit het contact (4).

 

 

Hardware

Voor beide controllerfamilies, ESP32 en ESP8266, moet je eerst nadenken over de GPIO-pinnen die gebruikt kunnen worden. Sommige ervan zijn geïntegreerd in het opstartproces en kunnen daarom niet zonder beperkingen worden gebruikt. Naast drie IRQ-ingangen, een knopingang en een LED-uitgang hebben we ook de I2C- en SPI-bussen nodig, die alleen al 6 pinnen bezetten. De tabellen geven informatie over het gebruik van de pinnen. Bij de ESP8266 blijven naast de buslijnen slechts 3 GPIO-pinnen over, waarvan D0 = GPIO16 niet IRQ-compatibel is. De “kleintjes” zijn daarom uitgesloten van ons project.

 

Maar er is ook een probleem met de ESP32. Pin 12 mag tijdens het opstarten niet HOOG staan, anders start de controller niet op. Helaas is deze aansluiting de MISO-lijn van de SPI1-bus en wordt deze door de slave naar 3,3V getrokken. Daarom is SPI1 taboe. Gebruik dus SPI2 of Soft-SPI. Daar komen we in het volgende bericht op terug.

 

Laten we verder gaan met de onderdelen die nodig zijn voor het project. In de tabel staan ​​alle componenten vermeld die nodig zijn gedurende het hele project. In deze eerste aflevering worden de grijs gemarkeerde in eerste instantie niet gebruikt.

 

1

ESP32 Dev Kit C niet gesoldeerd of

ESP32 Dev Kit C V4 ongesoldeerd of

ESP32 NodeMCU-module WLAN WiFi-ontwikkelbord met CP2102 of

NodeMCU-ESP-32S-kit of

ESP32 Lolin LOLIN32 WiFi Bluetooth-ontwikkelkit

1

10x N/O Reedschakelaar Magnetische schakelaar 2*14 mm

1

Realtimeklok RTC DS3231 I2C realtimeklok

1

SPI-lezer Micro-geheugen SD TF-kaart Geheugenkaart Shield-module

1

SD-kaart bijvoorbeeld 8GB

1

GY-21 HTU21 Vochtigheids- en temperatuursensor

1

MB-102 Broodplank Broodplank met 830 contacten 3st

1

0,96 inch OLED SSD1306-scherm I2C 128 x 64 pixels

1

LED

1

Weerstand 220Ω

2

Weerstand 10kΩ

1

KY-004 knopmodule of

Microschakelaarknopset - 180 stuks, verschillende maten, veelzijdige knoppen voor elektronica

optioneel

Logica-analysator

Tabel 3: Componenten

 

Van de 10 reedcontacten in de set zijn er 2 nodig (of zoals ik, zes).

 

Het schakelschema in figuur 11 laat zien hoe de onderdelen zijn aangesloten.

 

Figuur 11: Regenmetercircuit

 

De software

Voor het knipperen en programmeren van de ESP32:

Thonny of

µPyCraft

 

 

Firmware gebruikt voor een ESP32:

Micropython-firmware downloaden

 v1.19.1 (18-06-2022).bin

 

 

De MicroPython-programma's voor het project:

time-out.py Niet-blokkerende softwaretimer

oled.py OLED-API

ssd1306.py OLED-stuurprogramma

regenmes.py Demoprogramma

 

MicroPython - taal - modules en programma's

Om Thonny te installeren kun je er hier een vinden gedetailleerde instructies (Engelse versie). Er staat ook beschreven hoe u dit kunt doen Micropython-firmware (vanaf 18 juni 2022) op de ESP-chip verbrand wordt.

 

MicroPython is een tolktaal. Het belangrijkste verschil met de Arduino IDE, waarbij je altijd en uitsluitend hele programma's flasht, is dat je de MicroPython-firmware in het begin maar één keer hoeft te flashen op de ESP32, zodat de controller de MicroPython-instructies begrijpt. U kunt hiervoor Thonny, µPyCraft of esptool.py gebruiken. Ik heb het proces voor Thonny hier beschreven.

 

Zodra de firmware is geflasht, kunt u een informeel gesprek met uw controller voeren, individuele opdrachten testen en onmiddellijk de reactie zien zonder eerst een heel programma te hoeven compileren en overbrengen. Dat is precies wat mij stoort aan de Arduino IDE. U bespaart veel tijd als u via de opdrachtregel eenvoudige syntaxis- en hardwaretests tot en met het uitproberen en verfijnen van functies en volledige programmaonderdelen kunt uitvoeren voordat u er een programma van bouwt. Voor dit doel maak ik altijd graag kleine testprogramma's. Als een soort macro combineren ze terugkerende opdrachten. Uit dergelijke programmafragmenten ontstaan ​​soms hele applicaties.

 

Automatisch starten

Als u wilt dat het programma autonoom start wanneer de controller wordt ingeschakeld, kopieert u de programmatekst naar een nieuw aangemaakt leeg bestand. Sla dit bestand op als main.py in de werkruimte en upload het naar de ESP-chip. De volgende keer dat u reset of inschakelt, start het programma automatisch.

 

Programma's testen

Programma's worden handmatig gestart vanuit het huidige editorvenster in de Thonny IDE met behulp van de F5-toets. Dit is sneller dan klikken op de startknop of het menu gebruiken loop. Alleen de modules die in het programma worden gebruikt, moeten in de flash van de ESP32 staan.

Arduino IDE weer tussendoor?

Als je de controller later weer samen met de Arduino IDE wilt gebruiken, flash je het programma gewoon op de gebruikelijke manier. De ESP32/ESP8266 vergat toen echter dat hij ooit MicroPython sprak. Omgekeerd kan elke Espressif-chip die een gecompileerd programma bevat uit de Arduino IDE of de AT-firmware of LUA of ... eenvoudig worden voorzien van de MicroPython-firmware. Het proces is altijd zo hier beschreven.

 

 

Een eerste test

Het is het beste om hiermee te beginnen Upload de volgende bestanden naar de ESP32-flitser:

 

oled.py, ssd1306.py, ds3231.py en timeout.py

 

Als alles gemonteerd is, starten we met de eerste tests. In VERV laten we de volgende regels invoeren. Het mooie van MicroPython is dat je het effect van opdrachten vanaf de opdrachtregel kunt testen voordat je ze in een programma opneemt. Dat is precies wat wij nu doen. We plaatsen de rocker in de linkerpositie. De vermeldingen zijn vetgedrukt, het systeem antwoordt cursief.

 

>>> from machine import Pin

>>> reedR = Pin(16,Pin.IN)

>>> reedL = Pin(17,Pin.IN)

>>> reedR()

1

>>> reedL()

0

 

Na het inklappen van de rocker:

 

>>> rietR()

0

>>> rietL()

1

 

Dus dat werkt. Bij het opvragen van de niveaus gebruik ik de eigenschap pin-objecten opvraagbaar, dat wil zeggen opvraagbaar zijn. Dit gebeurt via de methode Pin.__bel__() maakt het mogelijk. Ze behoort tot de zogenaamde Magische methoden en zorgt ervoor dat het object als een functie kan worden aangeroepen. De volgende instructies moeten daarom als synoniemen worden gebruikt.

 

>>> rietR(1)

>>> reedR.waarde(1)

>>> reedR.on()

 

Of

 

>>> rietR()

0

>>> reedR.waarde()

0

>>> reedR.on()

0

 

Volgende test: I2C-bus. We binden de module SoftI2C één, instantiëer een object, i2c en kijk wie er in de bus is vertegenwoordigd.

 

>>> van machine-import Pin, SoftI2C

>>> i2c=SoftI2C(scl=Pin(22),sda=Pin(21),freq=100000)

>>> i2c.scan()

[60, 87, 104]

 

Het zal je waarschijnlijk verbazen dat er drie adressen van randapparatuur worden gevonden, aangezien we maar twee modules op de bus hebben. Ja, maar - naast de RTC-chip heeft de DS3231-module ook een 32Kb = 8KB EEPROM met het hardware-adres 87 = 0x57 op het bord. Van belang voor ons zijn de 60 = 0x3C (OLED) en de 104 = 0x68 (DS3231). De EEPROM zou bijvoorbeeld kunnen worden gebruikt om configuratiegegevens permanent op te slaan. Het werkt dus ook.

 

Oled-scherm: Bij het instantiëren passeren we het I2C-object en vertellen de API dat ons scherm 64 pixels hoog is.

 

>>> d=OLED(i2c,hoogtew=64)

dit is de constructor van de OLED-klasse

Afmeting: 128x64

>>> d.writeAt("Hallo wereld",3,0)

13

 

In het midden van de bovenste regel staat "Hallo wereld". De geretourneerde waarde 13 is de volgende vrije schrijfpositie in de regel.

 

De RTC (Real Time Clock) bevindt zich ook op de I2C-bus. We geven daarom ook de I2C-instantie door aan de constructor van het RTC-object. Vervolgens stellen we de datum en tijd in en halen we de tijd op. Er moet een tupel met de volgende zeven waarden worden doorgegeven (jaar, maand, dag, dag van de week, uur, minuut, seconde). Ook de zeer uitgebreide module is de moeite waard ds3231.py om het van dichterbij te bekijken.

 

>>> rtc=DS3231(i2c)

DS3231 bereit @ 0x4C

>>> rtc.DateTime((2024,6,14,5,14,19,30))

>>> rtc.Time()

[14, 19, 32]

 

De ESP32 beschikt ook over een RTC, maar beschikt niet over een alarmtimer. Om een ​​wekkerfunctie te krijgen moeten we gebruik maken van de DS3231 en – kortom programma-onderbrekingen IRQS. Ze worden gebruikt om een ​​externe gebeurtenis aan het lopende programma te melden en om de werking ervan aan te vragen door het programma onmiddellijk te onderbreken (interruptverzoek).

 

De tuimelcontacten en de RTC kunnen dergelijke gebeurtenissen activeren door het niveau op een GPIO-pin te wijzigen (pin-change IRQ). We moeten voor elke gebeurtenis een GPIO-invoer definiëren. De IRQ kan worden ingeschakeld nadat een interrupt service routine (ISR) is gedefinieerd. In de parameter pin Het triggerpin-object wordt door het systeem doorgegeven. De ingangen zijn aangesloten op externe pull-ups van 10kOhm omdat de interne een te hoge impedantie hebben. Dit verbetert de helling – dat is wat de DSO (Digital Storage Oscilloscope) mij vertelde.

 

>>> reedR = Pin(16,Pin.IN)

>>> reedL = Pin(17,Pin.IN)

led=Pin(2,Pin.OUT,value=0)

 

>>> def pinIRQ(pin):

    global source

    if pin==reedL:

        source="L"

        led(0)

    elif pin==reedR:

        source="R"

        led(1)

 

>>> reedR.irq(handler=pinIRQ, trigger=Pin.IRQ_FALLING)

<IRQ>

>>> reedL.irq(handler=pinIRQ, trigger=Pin.IRQ_FALLING)

<IRQ>


 

Bij het inschakelen wordt de referentie naar de ISR overgedragen en wordt de dalende flank als trigger ingesteld.

 

Als de wip nu met de hand wordt gekanteld, brandt de LED bij een kanteling naar rechts en gaat uit bij een kanteling naar links. – Griezelig, toch? – Er loopt geen programma en de contacten zijn niet rechtstreeks op het LED-circuit aangesloten. De IRQ's zijn dus ook actief als er geen hoofdprogramma actief is. Wat nu wordt onderbroken is VERV, de Reed Eval Print Loeps. En dus schakelen we de magie weer uit.

 

>>> reedL.irq(handler=None)

<IRQ>

>>> reedR.irq(handler=None)

<IRQ>


 

Deze gebruiken wij om op te ruimen als we het programma verlaten en een schone kamer achterlaten. We kunnen dit proces activeren door op de knop op GPIO4 te drukken - later, niet nu.

 

Voor de Hartslag (teken van leven) tijdens het draaien van de hoofdlus gebruiken we de LED en een niet-blokkerende softwaretimer. Dit draait op de achtergrond zonder de uitvoering van de lus te blokkeren. De magie is hier alles in één Sluiting. Dit is een functie ingekapseld in een omringende functiedefinitie. Omdat de innerlijke functie variabelen uit de omringende functie gebruikt, blijven zowel de innerlijke functie als de variabelen in leven nadat ze de omringende functie hebben verlaten. Normaal gesproken worden alle ingewanden van een functie gepureerd als ze deze verlaten. Oh mystieke MicroPython – Ommm!

 

De omringende functie wordt hier aangeroepen TimeOutMs(). Ze woont in de module time-out.py, van waaruit we ze importeren. In TimeOutMs() leeft de functie vergelijken(), dat het doorgegeven argument 5000 en ook de huidige status van de timertik ophaalt. Zolang het verschil tussen andere tijdstempels en de aan het begin geregistreerde timertik niet groter is dan 5000, levert de functie vergelijken() retourneert de waarde False, anders True. TimeOutMs() retourneert een verwijzing naar bij het afsluiten vergelijken() terug en maakt zo de sluiting onsterfelijk. Deze referentie wijzen wij toe aan de identifier knippert nu en kan de functie gebruiken vergelijken() onder het pseudoniem knippert nu bel op elk gewenst moment.

 

>>> from timeout import TimeOutMs

>>> jetztBlinken=TimeOutMs(5000)

>>> jetztBlinken()

False

>>> jetztBlinken()

False

>>> jetztBlinken()

True

 

Na vijf seconden krijgen we het resultaat WAAR. De functiedefinitie is nogal mager, maar het onderzoeken waard. Om dit te doen, opent u eenvoudig het bestand time-out.py in een editorvenster.

 

 

Het programma

Met deze handtesten hebben we eigenlijk al het hele programma besproken. Alle elementen verschijnen opnieuw in misschien wel een iets andere volgorde, met een paar kleine toevoegingen waar commentaar op wordt gegeven.

 

# regenmesser.py

 

from oled import OLED

from machine import Pin, SoftI2C

from time import sleep_us, sleep, sleep_ms

from ds3231 import DS3231

import sys

from timeout import TimeOutUs, TimeOutMs

 

# externe 10k-Pullups bringen steilere Flanken!

reedR = Pin(16,Pin.IN) # rechts prellt 75us

reedL = Pin(17,Pin.IN) # links kein Prellen

key=Pin(4,Pin.IN,Pin.PULL_UP) # Tasteneingang an GPIO4

                              # mit internem Pullupwiderstand

led=Pin(2,Pin.OUT,value=0)

 

i2c=SoftI2C(scl=Pin(22),sda=Pin(21),freq=100000)

i2cDevices=i2c.scan()

i2cNamen={ # Das Dictionary erleichtert die Identifikation

    0x57"DS3231.EEPROM 32Kb",

    0x68"DS3231.RTC",

    0x3C"OLED",

    0x40"SHT21",

    }

print("I2C-Devices @ ")

for i in i2cDevices:  # Nummer in Hexcode und Klartext wandeln

    print(hex(i),i2cNamen[i])

print()

 

d=OLED(i2c,heightw=64)

rtc=DS3231(i2c)

 

source="*"

 

# Inhalt der Kippschalen in ccm

cLinks = 2.4  # ccm

cRechts = 2.5

 

# Trichter Durchmesser d=10,9cm

area=(10.9/2)**2 * 3.1415  # Trichterfläche

bucketHour=0 # Der Sammeleimer

     

# IRQ-Service-Routine

def pinIRQ(pin):

    global source # Damit der neue Wert die ISR verlassen kann

    if pin==reedL:

        source="L"

    elif pin==reedR:

        source="R"

 

def shutdown(): # Funktion zum Aufraeumen beim Beenden

    reedL.irq(handler=None)

    reedR.irq(handler=None)

    print("von User abgebrochen")

   

# Pin Change IRQ scharfschalten

reedR.irq(handler=pinIRQ, trigger=Pin.IRQ_FALLING)

reedL.irq(handler=pinIRQ, trigger=Pin.IRQ_FALLING)

 

jetztBlinken=TimeOutMs(2000# Das erste Blinken initiieren

 

while 1:  # Hauptschleife

    Y,M,D,_,h,m,s=rtc.DateTime() # Datum und Zeit holen

    if source=="L":

        source="#"  # Trigger zuruecksetzen

        bucketHour += cLinks  # aufsummieren

        print("Links", bucketHour,"+",h,":",m,":",s)

 

    elif source=="R":

        source="-"  # Trigger zuruecksetzen

        bucketHour += cRechts # aufsummieren

        print("rechts",bucketHour,"-",h,":",m,":",s)

 

    datum=f"{D:02}.{M:02}.{Y}" # Datums- und Zeit-String bauen

    zeit=f"{h:02}:{m:02}:{s:02}"

    niederschlag="\'\'\'\' {:.2f} mm".  /

    format(bucketHour/area*10# dto. Niederschlag in mm

 

    d.clearAll(False)          # Display loeschen

    d.writeAt(datum,3,0,False)

    d.writeAt(zeit,4,1,False)

    d.writeAt(niederschlag,3,3)

   

    if jetztBlinken(): # Wenn Timer abgelaufen, kurz blitzen

        jetztBlinken=TimeOutMs(2000# Ablauf neu setzen

        led(1# LED an

        sleep_ms(5)

        led(0# und wieder aus

       

    if key()==0# Falls Taste key gedrueckt,

        sys.exit(shutdown()) # shutdown() aufrufen und Ende

Om tekst gemengd met cijfers uit te voeren, kunt u op voordelige wijze formatstrings gebruiken. Er zijn twee varianten, f-reeks en de functie formaat(). De citaten zijn vergelijkbaar.

 

>>> D,M,Y = 14,6,2024

>>> f"{D:02}.{M:02}.{Y}"

'14.06.2024'

 

Dit zet de dag en de maand in twee cijfers en het jaar in een string, gescheiden door punten.

 

>>> "{:02}.{:02}.{}".format(D,M,Y)

'14.06.2024'

 

Dit formulier levert hetzelfde resultaat op. De eerste variant is ideaal voor de structuur van HTML-teksten. Bij de tweede variant kan de regel worden onderbroken met "\" als deze te lang wordt, zoals in de bovenstaande lijst. De formaatinstructies zijn zeer divers. Als je ze allemaal zou opsommen, zou je verschillende blogafleveringen kunnen vullen.

 

Een woord over de display-uitgangen. Wijzigingen voor het display worden eerst naar een buffergeheugen in RAM geschreven, dat ook direct naar het display wordt gestuurd als u zich in de schrijfAT()- of helderAlles() geef het argument weer Vals weglaat of via a WAAR vervangen. Maar het scherm flikkert dan en dat is vervelend. Daarom laat ik de nieuwe bufferinhoud eerst volledig in het RAM opbouwen en pas met het laatste schrijfcommando de volledige inhoud overbrengen. Dat haalt de hectiek uit het geheel.

 

Start nu het programma en beweeg de wip. De linker- of rechteruitvoer kan meerdere keren achter elkaar verschijnen, zelfs als er slechts één kantelbeweging is uitgevoerd. Dit fenomeen had ik ook bij mijn rechter reedcontact: contact stuiterde bij het sluiten. Hoe dit programmatisch kan worden geëlimineerd en verdere toevoegingen aan het project zullen in de volgende aflevering worden gegeven.

 

Tot die tijd – blijf op de hoogte!


Esp-32Esp32Esp32-dev-kitGrundlagen softwareProjekte für fortgeschritteneSensoren

1 Reactie

Francesco Cerquone

Francesco Cerquone

Salve. Mi chiedevo se per misurare in modo semplice la quantità di acqua caduta dal cielo non è meglio misurare il suo peso, anzichè il suo volume?
Per esempio un estensimetro o cella di carico come sensore del peso dell’acqua….

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery