2018年12月13日 星期四

Python re 模組 (備忘)


功能太多,每次要用都要重學的模組

要找保留字的話,前面要加  \ 符號

 .   代替任何字元

 *  重複此符號前面的項目零次或多次
     項目可為 [] 所指定的內容,或是 

 +   重複此符號前面的項目至少一次,至多次
      譬如找數字  [0-9]+ 找一個以上的數字串
     也可用 \d+ 來實現

[...]  搜尋 [] 內指定的字元,譬如只找數字 [0-9] ,只找英文字[a-zA-Z],只找小寫字母[a-z]

(?#...)  在本已複雜難懂的正則表達式中加註釋,使字串更難以閱讀 (?#....) 中的內容會被忽略

 (?<=....)   找尋字串的開頭須符合 括號內指定的項目  
          
 (?=....)     找尋字串的結尾須符合 括號內指定的項目  

 (?!....)     找尋字串的結尾不包含 括號內指定的項目  


re.compile(pattern[, flags])

re.search(pattern, string[, flags])


譬如 telnet 有控制碼 '\x1b[...;...m' 做前景被景顏色控制
可用pattern  '\x1b\[[0-9;]*m' 來找出有關顏色控制的字串
若無,則回傳 None

a = re.search('\x1b\[[0-9;]*m', receivedata)
# 由於 [ 為保留字,要找保留字符時,前面要加 \
# 數值與 ; 有可能出現多次,故使用 * 來表達*前面的項目要重複找
if a != None:
    control_code = receivedata[a.start():a.end()]  # 取出控制碼








2018年6月18日 星期一

Micropython on ESP8266 (windows)


前幾天看到有人介紹 MicroPython on esp8266,於是翻找出2015年時買的 NodeMCU WiFi板來試看看

Micro python 介紹 http://docs.micropython.org/en/latest/esp8266/index.html

以下包含:
 Windows環境中安裝 micropython 到 esp8266
 設定 repl
 連接 OLED (使用SPI 介面)   
         I2C 請參考 https://medium.com/@rovai/micropython-on-esp-using-jupyter-6f366ff5ed9
 顯示文字到 OLED

1. 安裝 esptool 
    命令提示字元下輸入
 pip install esptool

  安裝完後,建議將 C:\Python36-32\Lib\site-packages\ 下的 esptool.py 拷貝到其他目錄
  e.g: d:\esp8266\


2. 接上裝置,查看電腦偵測到的串列通訊連接埠(com)是多少
   清除flash
    python esptool.py --port com3 --baud 19200 erase_flash
下載image (  http://micropython.org/download#esp8266   )
 下面用 esp8266-20180511-v1.9.4.bin 舉例
   python esptool.py --port com3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin


3.開啟 putty (或其他可用com串列通訊的程式)
    使用 115200 bps 通訊速度
 按 [Enter] 後可以看到提示字元
 









4. 設定 webrepl (可以使用網頁方式操作repl)
 先設定後可以使用網頁方式連線 webrepl
    在TTY 下設定使用 webrepl
    import webrepl_setup
reboot後,要重新插拔裝置,再連線

5. 設定 WiFi 連區網
 TTY中按 Ctrl + E 可以用黏貼模式直接貼一整段 code,貼完後按 Ctrl + D 結束
import network
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect("SSID", "PASSWORD")
print(sta_if.ifconfig())
import webrepl
webrepl.start()
SSID, PASSWORD 請自行換成所用的區網訊息

 按 Ctrl + D 後會執行剛才輸入的程式,如下:(IP會有所不同,看區網設定)
預設會打開 AP mode (192.168.4.1)
 可以搜尋 wifi 訊號,找到 MicroPython-xxxxxx  (每個裝置會有不同的號碼)
 或使用前面資料開啟的 STA mode

6. 使用webrepl 連線
  http://micropython.org/webrepl/
如果是連線到esp8266 的AP,可以直接按 Connect 做連線
 若是連到自己的區網,後面網址需修改為步驟 5 時得到的 IP 
 WebREPL連線時,會要求 步驟4 設定的密碼
(上面是連線後按了多次 [Enter])

7. 下載 boot.py 程式做修改
    網頁 WebREPL 畫面的最右邊或最下方,有操作介面
 可以 直接上傳本機電腦中檔案 或 下載ESP8266中的檔案
 下載 boot.py











   注意:瀏覽器可能會警告下載 .py 類型的檔案

8. 修改 boot.py 檔案後再上傳
 將網路設定寫到 boot.py 中,這樣之後 reboot ,就能直接用 webrepl 連線

9. 下載 OLED driver
 可以在 https://github.com/micropython/micropython 下載驅動
 以下將使用 https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py
 透過 網頁 WebREPL 將 ssd1306.py 下載到 ESP8266 中

10. 連接 OLED with SPI
 (2014買的OLED,板子預設是使用 SPI 介面)




















11. 寫 OLED init 程式
from machine import SPI
from machine import Pin
import ssd1306
dc_pin = Pin(5, Pin.OUT)
cs_pin = Pin(15, Pin.OUT)
res_pin = Pin(4, Pin.OUT)

spi = SPI(baudrate = 100000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
#class SSD1306_SPI(self, width, height, spi, dc, res, cs, external_vcc=False):

oled = ssd1306.SSD1306_SPI(128, 64, spi, Pin(5), Pin(4), Pin(15))
oled.init_display()
oled.fill(0)
oled.text('test', 0 ,0)
oled.show()
將程式命名後上傳到 ESP8266 中,即可使用 import XXXX.py 後執行



























12. 後記
 SPI 挺浪費有限的 GPIO,現今買的 OLED 預設多為 I2C 介面,只需兩隻接腳。
 可以將連線的 IP 顯示在 OLED 上,就可以都用 WiFi 做連線控制。
 網路上有神人做 WiFi 跑 MQTT;可以一對多控制,需要再花時間研究。
 還沒測試 IRQ,這個應該是單晶片機上比較需要的功能。
P.S:
   1. 注意 .py程式的縮排,不支援 TAB,需使用 SPACE. 
   2. 原先 NodeMCU系統重新配置的 IO 腳位是印在電路板上,在 MicroPython 使用的是晶片原始的 GPIO,要參考原始的配置,而不是看電路板上標明的值。
3. https://forum.micropython.org/viewtopic.php?t=2440
        RTC的使用方法
  import ntptime
  rtc = machine.RTC()
  ntptime.settime() # update time form internet
  print(str(rtc.datetime())

#Timer 使用參考 https://www.dfrobot.com/blog-606.html