平头哥CDK W806-KIT单片机技术交流组
直播中

华仔stm32

4年用户 3157经验值
擅长:嵌入式技术
私信 关注

【联盛德W806-KIT开发板试用体验】LuatOS 完成18B20+OLED+串口打印

  今天整合了Luatos的18B20温度采集+串口打印输出。直接上代码:
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "mytemp"
  3. VERSION = "1.0.0"

  4. -- sys库是标配
  5. _G.sys = require("sys")

  6. -- 硬件接线
  7. --[[
  8. GPIO17     -- DAT
  9. VPAD/VDDIO -- VCC
  10. GND        -- GND
  11. ]]
  12. -- 对接SSD1306
  13. function display_str(str)
  14.     disp.clear()
  15.     disp.drawStr(str, 1, 18)
  16.     disp.update()
  17. end

  18. function ui_update()
  19.     disp.clear() -- 清屏

  20.     disp.drawStr(os.date("%Y-%m-%d %H:%M:%S"), 1, 12) -- 写日期

  21.     disp.drawStr("Luat@Air101" .. " " .. _VERSION, 1, 24) -- 写版本号

  22.     disp.update()
  23. end

  24. -- 初始化显示屏
  25. log.info("disp", "init ssd1306") -- log库是内置库,内置库均不需要require
  26. disp.init({mode="i2c_sw", pin0=1, pin1=4}) -- 通过PA1 SLK/PA4 SDA模拟, 也可以用硬件i2c脚
  27. disp.setFont(1) -- 启用中文字体,文泉驿点阵宋体 12x12
  28. display_str("启动中 ...")

  29. -- 串口ID,串口读缓冲区
  30. local UART_ID, sendQueue = 1, {}
  31. -- 串口超时,串口准备好后发布的消息
  32. --例子是100ms,按需求改
  33. local uartimeout, recvReady = 10, "UART_RECV_ID"
  34. --初始化
  35. local result = uart.setup(
  36.     UART_ID,--串口id
  37.     115200,--波特率
  38.     8,--数据位
  39.     1--停止位
  40. )
  41. NETLED = gpio.setup(18, 1)
  42. sys.taskInit(function()
  43.     while 1 do
  44.         -- 一闪一闪亮晶晶
  45.         NETLED(0)
  46.         sys.wait(500)
  47.         NETLED(1)
  48.         sys.wait(500)
  49.     end
  50. end)

  51. uart.on(UART_ID, "receive", function(uid, length)
  52.     local s
  53.     while true do--保证读完不能丢包
  54.         s = uart.read(uid, length)
  55.         if #s == 0 then break end
  56.         table.insert(sendQueue, s)
  57.     end
  58.     sys.timerStart(sys.publish, uartimeout, recvReady)
  59. end)

  60. -- 向串口发送收到的字符串
  61. sys.subscribe(recvReady, function()
  62.     --拼接所有收到的数据
  63.     local str = table.concat(sendQueue)
  64.     -- 串口的数据读完后清空缓冲区
  65.     sendQueue = {}
  66.     --注意打印会影响运行速度,调试完注释掉
  67.     log.info("uartTask.read length", #str, str:sub(1,100))

  68.     --在这里处理接收到的数据,这是例子
  69.      if str:find("12345678901234567890") == 1 then --如果满足开头
  70.          uart.write(UART_ID,"1234567890x2 lol") --回复
  71.      else
  72.          uart.write(UART_ID,"not match "..str) --回复
  73.      end
  74. end)

  75. sys.taskInit(function()
  76.     while 1 do
  77.         sys.wait(5000) -- 5秒读取一次
  78.                 local val,result = sensor.ds18b20(17, true) -- GPIO17且校验CRC值
  79.                 uart.write(UART_ID,"TEMP:" ..val.."rn") --回复
  80.         --log.info("sensor", "ds18b20", sensor.ds18b20(17)) -- GPIO17脚
  81.                  disp.clear() -- 清屏
  82.                  disp.drawStr("TEMP" .. " " .. val, 1, 24) -- 写版本号
  83.                  disp.update()
  84.     end
  85. end)

  86. -- 用户代码已结束---------------------------------------------
  87. -- 结尾总是这一句
  88. sys.run()
  89. -- sys.run()之后后面不要加任何语句!!!!!


更多回帖

发帖
×
20
完善资料,
赚取积分