Finally, I can say that I can program in the Python language. I learned Python from this tutorial. It is a good combination of the languages that I previously knew (PHP, Javascript and SQL). Structure also reminds me of Delphi and Basic languages.
Here is a program that reads 1-wire temperature sensor DS18B20 and displays it’s value on GUI (graphical user interface). GUI is made with wxPython library and with wxFormBuilder software.
In between sensor and computer there is Arduino Nano which transforms data from 1-wire to UART.
Python code:
#! /usr/bin/python # -*- coding: utf-8 -*- import wx import wx.xrc import serial from thread import start_new_thread class MyApp(wx.App): def OnInit(self): self.res = wx.xrc.XmlResource("gui.xrc") self.frame = self.res.LoadFrame(None, "MyFrame1") self.text1 = wx.xrc.XRCCTRL(self.frame, "m_textCtrl1") self.text2 = wx.xrc.XRCCTRL(self.frame, "m_textCtrl2") self.button1 = wx.xrc.XRCCTRL(self.frame, "m_button1") self.frame.Bind(wx.EVT_BUTTON, self.on_evt_button, id=wx.xrc.XRCID("m_button1")) self.SetTopWindow(self.frame) self.frame.Show() return True def on_evt_button(self, evt): self.button1.SetLabel("Wait...") self.button1.Enable(False) start_new_thread(readSerial,(self,)) def readSerial(self): try: with serial.Serial(self.text2.GetValue(), 9600, timeout=1) as ser: line = "" while len(line) == 0: ser.write("\n") line = ser.readline() self.text1.SetValue(line.splitlines()[0] + u"°C") except IOError: print("Port cannot be opened") self.button1.Enable(True) self.button1.SetLabel("Read sensor") app = MyApp(False) app.MainLoop()
XRC layout file generated from wxFormBuilder:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1"> <object class="wxFrame" name="MyFrame1"> <style>wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL</style> <size>-1,100</size> <title>1-Wire Temperature</title> <centered>1</centered> <aui_managed>0</aui_managed> <object class="wxGridSizer"> <minsize>-1,100</minsize> <rows>2</rows> <cols>3</cols> <vgap>0</vgap> <hgap>0</hgap> <object class="sizeritem"> <option>0</option> <flag>wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT</flag> <border>5</border> <object class="wxStaticText" name="m_staticText1"> <label>Outdoor temp</label> <wrap>-1</wrap> </object> </object> <object class="sizeritem"> <option>0</option> <flag>wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL</flag> <border>5</border> <object class="wxTextCtrl" name="m_textCtrl1"> <style>wxTE_READONLY</style> <size>100,-1</size> <value>---</value> </object> </object> <object class="sizeritem"> <option>0</option> <flag>wxALL|wxALIGN_CENTER_VERTICAL</flag> <border>5</border> <object class="wxButton" name="m_button1"> <label>Read sensor</label> <default>0</default> </object> </object> <object class="sizeritem"> <option>0</option> <flag>wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL</flag> <border>5</border> <object class="wxStaticText" name="m_staticText2"> <label>Port addr</label> <wrap>-1</wrap> </object> </object> <object class="sizeritem"> <option>0</option> <flag>wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL</flag> <border>5</border> <object class="wxTextCtrl" name="m_textCtrl2"> <size>100,-1</size> <value>/dev/ttyUSB0</value> </object> </object> </object> </object> </resource>
Arduino code:
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); void setup(void) { Serial.begin(9600); // start serial port sensors.begin(); // Start up the library } void loop(void) { while (Serial.available() > 0) { // if there's any serial available, read it if (Serial.read() == '\n') { // look for the newline sensors.requestTemperatures(); // Send the command to get temperatures Serial.println(sensors.getTempCByIndex(0)); // get temperature from first sensor only } } }