Log Micropython console text to file
Here is a small snippet, how you can write everything what you get on console to file in your Micropython device. This may help you to debug long running devices.
import io, os class logToFile(io.IOBase): def __init__(self): pass def write(self, data): with open("logfile.txt", mode="a") as f: f.write(data) return len(data) # now your console text output is saved into file os.dupterm(logToFile()) # disable logging to file os.dupterm(None)
Project "SmartHome" build: Central
My personal project to build Smart Home system and learn Micropython by utilising LVGL on ILI9341 display by using ESP32 microcontroller.
Initial idea was to have one SmartHome Central space where I could see all rooms temperature and humidity measures in one place. I'm also planning to add soil moisture sensor (built on my favourite ESP32) and later on- control some of appliances at home. I did not want to go with already built systems (HomeAssistant or Tasmota) as my goal was to learn to build multi-component system by myself.
Central Unit
Source is available on my github repository. Comments and ideas are welcome.
Central unit is ESP32 generic (no PSRAM) with 4mb PSRAM microcontroller with Micropython + LVGL firmware and ILI9341 display. It listenf for messages in MQTT and display innformation on screen. Also weather integration is made: current weather outside and forecast
Wire connection diagram | |
ESP32 | ILI9341 |
3v3 | VCC |
GND | GND |
26 | CS |
33 | Reset |
27 | DC |
23 | SDI (Mosi) |
18 | SCK |
32 | LED |
19 | SDO (Miso) |
14 | T_CLK |
15 | T_CS |
13 | T_DIN |
12 | T_DO |
35 (not used) | T_IRQ |
I've used two different SPI busses, One for ILI9341 and another one for XTP2046 (touch) as i had plenty of pins on my central device.
Proxy unit
Source is available on my github repository.
Proxy unit is also ESP32 generic based device, witch listens to all available BLE advertisement packages. It filters know MAC addresses and forward that messages to MQTT.
BLE thermometers
Probably, this section may be most interesting for various DIY'ers
Once I've stumbled on Youtube video, where person was discussing to DIY or BUY temperature sensor. Probably, you can not DIY cheaper yourself, because this sensor cost 4$. Yes, four dollars! It can be used as stand alone device as it is has its own screen.
Issue was BLE advertisement is encoded. Dear Xiaomi- let us use your devices freely in out projects. Open source is future!
But lucky for us, DIY'ers, AAron Christophel dedicated a lot of his own time and was able to write custom firmware for extra cheap (4$) Xiaomi Thermometer model LYWSD03MMC. Its easy to change firmware in thermometer with any regular Android device. No additional hardware is needed. To change firmware- download bin file from ATC github repository to your phone. Then open web flasher. I've used Android Chrome browser for flashing.
Always consult official repository how flashing procedure is done! It may change over time.
- Download firmware file
- Enable bluetooth on your device.
- Open web flasher page and press button “Connect” and choose your device. If it is the first time you flash firmware- its name will be LYWSD03 or something similar. After flashing- it will be ATC_######. Last six digit will be last six pairs of your device mac address.
- “Do activation”. It connect to device and calculates Device ID, token and Bind key. Nothing will be changed in firmware.
- Choose bin file. Take care of what file you choose. Mistake can brick your device. Anyway, not a huge loss- it's dirt cheap
- “Start flashing”. It may take 60-100 seconds to complete. It should restart after finishing. If it did not- wait 5 minutes and remove battery from thermometer.
Soil moisture sensors
I'm planning battery (LiFePO4) powered ESP32 device to measure soil moisture of my balcony greens and send data to central unit via BLE advertisement. My choice of LiFePO4 battery was because it's perfect candidate to directly power ESP32 (without any power management devices). More about that in my later posts. Now i'm in progress of building this.
What i have learned
- How BLE advertisement works;
- Setup environment, required for Micropython firmware building;
- What is MQTT and how it works, setup server locally.
Pure python and very simple event management library
In event driven programming events are crucial. My requirements was Micropython platform on ESP32 micro-controller, so i could not use any other events library out-there. I've stumbled one very basic, very simple library and gave it a try… and it worked out-of-the-box for my case. When testing various event management libs out there I've stumbled on something similar, but it did not worked within classes. Python is nothing but classes everywhere :)
I was testing and extended this very simple python script, that perfectly works as main element in event driven development.
Strengths of library:
- Observer can be declared before event type is created
- Events can be fired even if there is no observers.
- Works as pure python script
- Works on micropython platform
- Event name can be any string
I'm using this solution for event for timer, that fires each second and observe “ticker” where i need to update clock. I use clock in multiple places in my micropython script and i can get away with just one hardware timer used.
Honorable mentions goes to Pithikos from StackOverflow this answer
I have extended this library with possibility to forget event.
- EventObserver.py
class Observer(): _observers = [] def __init__(self): self._observers.append(self) self._observed_events = [] def observe(self, event_name, callback_fn): self._observed_events.append({'event_name': event_name, 'callback_fn': callback_fn}) def forget(self, event_name): for dict_item in self._observed_events: for key, val in dict_item.items(): if val == event_name: self._observed_events.remove(dict_item) class Event(): def __init__(self, event_name, *callback_args): for observer in Observer._observers: for observable in observer._observed_events: if observable['event_name'] == event_name: observable['callback_fn'](*callback_args)
Here is example of how to use this library
- example.py
import EventObserver # class object MUST inherit Observer object if you use it within class class Room(Observer): def __init__(self): print("Room is ready.") Observer.__init__(self) # DON'T FORGET THIS # observer can be declared already in class init method with following line # this.observe('someone sneezed', this.someone_sneezed) def someone_arrived(self, who): print("{} has arrived!".format(who)) def someone_sneezed(self, who): print("{} has just sneezed!".format(who)) # Observe for specific event room = Room() room.observe('arrived', room.someone_arrived) room.observe('sneezed', room.someone_arrived) # Fire some events Event('left', 'John') # no events are attached to event "someone left" Event('arrived', 'Lenard') # will output "Lenard has arrived!" Event('sneezed', 'Jenny') # will output "Jenny has just sneezed!" # Remove known event room.forget('arrived') # no events based on 'someone arrived' will be fired '''
Pages in this namespace:
RC Plane telemetry
I never forgot my old dream- to have my own DIY telemetry system
And here after like 7 years, when technology advanced (my knowledge, also)- I have finished building my project. And my main problems are solved with two unit of ESP32 microcontrolers and Android phone. Hardware is two ESP32 units with integrated SX1278 interface and one Beitian BN-220 GPS and GLONAS receiver.
I dont realy like C programming, so my choise of microcontroller was based on availability to use other languages for programming. Initial idea was to use Espruino firmware and use Javascript language for programming. But the issue at the time of research was BLE interface was not available (Harware supports it). Other options was Micropython and LUA. I have burned Micropython firmware into ESP32
So, here is how everything works: microcontroler ESP32 read GPS receiver data, extract required informaation and… taaadaaaa…
LoRa is used to transfer data to ground unit. Once i've tested range of my LoRa equiped ESP32's units- I've received over 2.2 km LOS at 433mhz. As i'm flying my plane in line of sight- it's plenty for me.
Ground unit listend for air unit frequincy, extract data and via BLE interfaace share this information with my Android device. Device application is created using Droidscript.
Each time i'm testing something new, like programming language, i choose to build solution that would help in my life. This way I can learn more about tool, test is it suitable for me and solve my issue if I succeed.