Stap 5: Firmware - ATmega328p
De firmware voor deze chip kan worden gevonden in de atmega328p directory van het broncode repository. Deze code is geschreven in C, dient te worden verzameld met behulp van AVR-GCC, en naar de chip met behulp van Atmel Studio of AVRDUDE en een externe AVR-programmer kan worden geflitst. Dit is niet Arduino code. Er zijn een paar wijzigingen in de code die wordt gebruikt in de LCD Reader Instructable, dus ik zal kort ingaan op deze punten.
Bij het opstarten, zal de volgende acties plaatsvinden:
- Initialiseren van de I/O pinnen en randapparatuur
- De ESP8266 inschakelen
- Inschakelen van de schaal, zorgen in de modus van het gewicht met gram als eenheid
- I2C bus inschakelen
- Voer de hoofdlus
De hoofdlus doet de volgende dingen ongeveer een keer per seconde:
- Lees het LCD-scherm
- Het decoderen van de LCD-gegevens naar een gewicht in gram
- Resetten van de ESP8266, indien gevraagd
- Houd de schaal wakker (iedere 45 seconden)
Om te houden de omvang wakker, is de eenheid-knop een paar keer ingedrukt. Anders treedt de schaal een klok weergavemodus die gemakkelijk kan niet worden verlaten. Hoewel deze chip de belangrijkste controller is, fungeert het als een slaaf op de I2C-bus. Dit gebeurde voornamelijk omdat de ESP8266 module in gebruik geen toegang tot de werkelijke I2C hardware pinnen heeft, en een "bit-bang"-model veel gemakkelijker is te implementeren dan een slaaf.
Wanneer een I2C lezen wordt gestart, worden de cijfers van de schaal op de bus verzonden. De eerste byte vertegenwoordigt de bovenste twee cijfers, terwijl de tweede byte de onderste twee cijfers vertegenwoordigt. Bijvoorbeeld, zou een gewicht van 1234 gram worden gestuurd als [12] [34]. Als de mega328 nooit een I2C schrijven verwacht, zulk een gebeurtenis signalen een reset verzoek door de ESP8266. Op dit moment, zal de mega328 trekken de lijn van de reset van de ESP8266 laag voor een paar milliseconden en laat het vervolgens. Dit wordt gebruikt als een rudimentaire manier om fout Staten in de ESP8266 overwinnen.