这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » DFrobot模块测量辐射值并通过wifi显示

共12条 1/2 1 2 跳转至

DFrobot模块测量辐射值并通过wifi显示

菜鸟
2024-06-16 21:25:41   被打赏 35 分(兑奖)     打赏

前面将DFrobot模块用MicroPython改写并在OLED上显示,本次将测量的数据通过wifi显示出来,

仍然使用MicroPython添加wifi模块,程序下载成功后,手机或电脑连接的WIFI和ESP32连接的WIFI处于同一频段(比如192.168.1.xx) 然后在网页输入Shell控制台输出的本机IP地址即可进入网页显示DFrobot模块采集的CPM和uSv/h数据,可手动刷新页面更新数据显示。

代码如下:

'''
DFrobot 盖革计数器实验
接线说明:DFrobot Geiger模块-->ESP32 IO
         (D)-->(14)
         (+)-->(5V)
         (-)-->(GND)
         
OLED(IIC)液晶模块-->ESP32 IO
         GND-->(GND)
         VCC-->(5V)
         SCL-->(18)
         SDA-->(23)
'''
#导入Pin模块
from machine import Pin
import time
from machine import SoftI2C
from ssd1306 import SSD1306_I2C  #I2C的oled选该方法
import network
import socket
#连接的WIFI账号和密码,此处需要按照实际填写
ssid = "wifi"
password = "******"
#创建软件I2C对象
i2c = SoftI2C(sda=Pin(23), scl=Pin(18))
#创建OLED对象,OLED分辨率、I2C接口
oled = SSD1306_I2C(128, 64, i2c) 
#Geiger in
Geiger_In=Pin(14,Pin.IN,Pin.PULL_UP)
#定义LED控制对象
led1=Pin(15,Pin.OUT,Pin.PULL_DOWN)
#WIFI连接
def wifi_connect():
    wlan=network.WLAN(network.STA_IF)  #STA模式
    wlan.active(True)  #激活
    
    if not wlan.isconnected():
        print("conneting to network...")
        wlan.connect(ssid,password)  #输入 WIFI 账号密码
        
        while not wlan.isconnected():
            led1.value(1)
            time.sleep_ms(300)
            led1.value(0)
            time.sleep_ms(300)
        led1.value(0)
        return False
    else:
        led1.value(0)
        print("network information:", wlan.ifconfig())
        return True
#网页数据
def web_page():
  html = """<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>DFRobot Geiger Counter</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">cpm</span> 
    <span>"""+str(cpm)+"""</span>
    <sup class="units">CPM</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">uSvh</span>
    <span>"""+str(uSvh)+"""</span>
    <sup class="uSv/h">uSv/h</sup>
  </p>
</body>
</html>"""
  return html
#Geiger计数器外部中断函数
def Geiger_In_irq(Geiger_In):
    global numPulse
    numPulse = numPulse + 1 
#程序入口
if __name__=="__main__":
    global numPulse
    BUFFER_SIZE = 20
    rows, cols = 2, BUFFER_SIZE
    mem_data = [[0 for _ in range(cols)] for _ in range(rows)]
    numPulse = 0
    pos = 0    
    oled.fill(0)  #清空屏幕    
    oled.text("Geiger Counter",0,0,1)  #显示字符串
    oled.show()  #执行显示
    if wifi_connect():
    #SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议
        my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #创建socket连接
    # 将socket对象绑定ip地址和端口号
        my_socket.bind(('', 80))
    # 相当于电话的开机 括号里的参数表示可以同时接收5个请求
        my_socket.listen(5)    
    
        Geiger_In.irq(Geiger_In_irq,Pin.IRQ_FALLING)  #配置外部中断,下降沿触发
    
    while True:  
        time.sleep_ms(3000)
        mem_data[0][pos] = time.ticks_ms()
        mem_data[1][pos] = numPulse
        numPulse = 0
        cpm=0
        pos_old = pos
        pos = (pos+1)%BUFFER_SIZE        
        numAll = 0
        uSvh = 0
        time_now = mem_data[0][pos_old] 
        for i in range(0, BUFFER_SIZE - 1):
            if mem_data[0][pos_old] != 0:
                numAll = numAll + mem_data[1][pos_old]
                time_old = mem_data[0][pos_old]
                if pos_old == 0:
                    pos_old =  BUFFER_SIZE - 1
                else:
                    pos_old = pos_old - 1
        if time_now-time_old > 0:
            cpm = numAll*1000*60/(time_now-time_old)
            uSvh = cpm/151
            
        str1 = "{:.0f}".format(cpm)    #CPM转字符串
        str2 = "{:.3f}".format(uSvh)   #uSv/h转字符串
        oled.fill(0)  #清空屏幕
        oled.text("Geiger Counter",0,0,1)  #显示字符串
        oled.text("CPM",80,10,2)  #显示CPM单位
        oled.text("uSv/h",80,20,2)  #显示uSv/h单位
        oled.text(str1,0,10,2)  #显示CPM数据
        oled.text(str2,0,20,2)  #显示uSv/h数据
        oled.show()  #执行显示
        print('uSvh=',uSvh)
        try:
                # 进入监听状态,等待别人链接过来,有两个返回值,
                #一个是对方的socket对象,一个是对方的ip以及端口
                client, addr = my_socket.accept()
                print('Got a connection from %s' % str(addr))
                # recv表示接收,括号里是最大接收字节
                request = client.recv(1024)
                request = str(request)
                print('Content = %s' % request)
                #sensor_readings = read_sensor()
                #print(sensor_readings)
                response = web_page()
                client.send('HTTP/1.1 200 OK\n')
                client.send('Content-Type: text/html\n')
                client.send('Connection: close\n\n')
                client.sendall(response)
                client.close()
        except OSError as e:
                conn.close()
                print('Connection closed')

程序下载到ESP32后,shell控制台显示如下,显示IP为192.168.2.118

打开浏览器,输入192.168.2.118后,显示CPM及uSv/h数据。

web.png





关键词: DFrobot     模块     测量 wifi    

高工
2024-06-16 22:21:01     打赏
2楼

谢谢分享


菜鸟
2024-06-16 23:15:12     打赏
3楼

谢谢分享


专家
2024-06-17 07:54:44     打赏
4楼

这个牛啊


专家
2024-06-17 08:52:55     打赏
5楼

感谢楼主分享


高工
2024-06-17 09:58:03     打赏
6楼

这个两个小模块看上去还是挺有可玩性的啊


专家
2024-06-17 21:30:43     打赏
7楼

感谢楼主分享


专家
2024-06-17 23:26:19     打赏
8楼

谢谢分享


专家
2024-06-19 22:39:17     打赏
9楼

谢谢分享


专家
2024-06-21 07:48:50     打赏
10楼

谢谢分享


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]