ESP8266 ds1208温度传感器 并通过MQTT发送到平台

##先联网

import socket, time, re

from machine import Pin,I2C

import network

import ujson

from machine import Timer

import os

import ssd1306

import socket

from configWifi import *

import urequests

from simple import MQTTClient

import onewire, ds18x20

from ds18x20 import DS18X20 

html = """<!DOCTYPE html>

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset = 'UTF-8'>

    <title>login</title>

</head>

<body style = "width: 100%;height: 100%;font-family: 'Open Sans',sans-serif;margin: 0;background-color: #4A374A;">

    <p id="login" style = "position: absolute;top: 50%;left:50%;margin: -150px 0 0 -150px;width: 300px;height: 300px;">

        <h1 style = "color: #fff;text-shadow:0 0 10px;letter-spacing: 1px;text-align: center;">Login</h1>

        <form method="post" style = "text-align:center">

        <input  id = "username" type="text"  required="required" placeholder="用户名" name="username"></input><br>

        <input id = "password" type="text" required="required" placeholder="密码" name="password"></input><br>

        <button class="but" type = "button" οnclick="onSubmit()" >登录</button>

        </form>

    </p>

</body>

</html>

<script>

    function onSubmit(){

    if (window.XMLHttpRequest) {

        // 用于现代浏览器的代码,code for IE7+, Firefox, Chrome, Opera, Safari

         xmlhttp = new XMLHttpRequest();

     } else {

        // 应对老版本 IE 浏览器的代码,// code for IE6, IE5

         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

     }

    

    xmlhttp.onreadystatechange = function() {

      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {

        //document.getElementById("username").innerHTML = xmlhttp.responseText;

        // document.getElementById("status").value = xmlhttp.responseText;

      }

    }

    xmlhttp.open("post", "/", true);

    var username = document.getElementById("username").value;

    var password = document.getElementById("password").value;

    var JsonObj = {"username":username,"password":password};

    //xmlhttp.send("{\"username\":\""+username+"\",\"password\":\""+password+"\"}");

    xmlhttp.send(JSON.stringify(JsonObj));

    }

    </script>

"""

def process_request(request):

    job = None

    try:

        data = request.recv(1024)#读取接受的字节"HTTP/1.1 200 OK\r\n"HTTP/1.1 200 OK\r\n\r\n

        data_str = data.decode()

        print (data_str)

        

        if data_str.split()[0] == 'POST':

            print("POST request")

            #data_str.replace('username====================','username:');

            #data_str.replace('username====================','password:');

            mat = re.search("{\"username\":.+?,\"password\".+\S}",data_str)

            print (mat)

            if mat != None:

                print (mat.group(0))

                #解析用户名和密码

                data_str = mat.group(0)

                job = ujson.loads(data_str)

                print('username',job['username'])

                print('password',job['password'])

                return job


 

        else:

            print("not POST request")

        request.sendall(bytes("HTTP/1.1 200 OK\r\n\r\n", "utf-8"))#返回一个服务器数据格式

        request.sendall(bytes(html, "utf-8"))

        return job

 

    except Exception as e:

        print(e)

        return None



 

    

 

def webConfigWifi():

    #开启AP模式

    ap = network.WLAN(network.AP_IF) # create access-point interface

    ap.active(True)         # activate the interface

    time.sleep(1)

    ap.ifconfig(('192.168.0.1', '255.255.255.0', '192.168.0.2', '8.8.8.8'))

    #配置为开放式热点

    ap.config(essid='ESP-AP',authmode=0) # set the ESSID of the access point

    time.sleep(1)

    try:

        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建一个服务器socket监听

        sock.bind(('192.168.0.1',80))

        sock.listen(5)#设置最大监听数

        while True:

            connection,address = sock.accept()#接受浏览器请求

            print('client connected from', address)

            js_ip_psw = process_request(connection)

            connection.close()

            if js_ip_psw!=None:

              global wlan

              wlan=connectWiFi(js_ip_psw['username'],js_ip_psw['password'])

              if wlan !=None:

                print("config success")

                file = open('config.txt','w')

                file.write("{'name':'%s','password':'%s'}"%(js_ip_psw['username'],js_ip_psw['password']))

                file.close()

                ap.active(False)

                return True

                break

              else:

                print("password error")

            else:

              pass

 

              

    except Exception as e:

        print (e)

        return False

    return False


 

'''

    @author st

    @date 20200812

'''      

 

#从文件中加载JSON配置文件

def loadConfigJSON():

    try:

        with open('config.txt','r') as f:

            js=f.readline().replace("'",'"')

            print(js)

            f.close()

            info=ujson.loads(js)

            return info

    except:

        f.close()

        return None

    pass

#连接WIFI 失败返回None,cnt 等待时间

def connectWiFi(ssid, pswd,cnt = 3):

    wlan = network.WLAN(network.STA_IF)

    wlan.active(True)

    print(wlan.ifconfig())

    if not wlan.isconnected():

        wlan.connect(ssid, pswd)

        while not wlan.isconnected():

            time.sleep(1)

            cnt=cnt-1

            if cnt<0:

                return None  

    print(wlan.ifconfig())  

    return wlan

#打印报警信息

def showWarning(lcd,msg):

    lcd.fill_rect(0, 32, 128, 32, 0)

    lcd.text(msg,0, 32,1)

    lcd.show()

def showInfo(lcd,msg):

    lcd.fill_rect(0, 0, 128, 32, 0)

    lcd.text(msg,0, 0,1)

    lcd.show()

def clearlcd(lcd):

    lcd.fill(0)

    lcd.show()

 

def pub(server="47.112.113.136",port = 1883,topic = 'temperature',msg = 'hello mqtt',username ='test',password = 'testpassword' ):

    try:

        c = MQTTClient("umqtt_client", server,port,username,password)

        c.connect()

        c.publish(topic, msg)

        c.disconnect()

        return True

    except:

        return False

 

def timerHandle(timer):

    global lcd

    showWarning(lcd,'start config')

    if webConfigWifi() == True:

        showWarning(lcd,'config finish')

    else:

        showWarning(lcd,'config fail')

    time.sleep(3)

#中断处理函数 回调定时器

def callback(P):

    tim.init(period=1000, mode=Timer.ONE_SHOT, callback=timerHandle)

'''lcd.fill(0)

  lcd.text('server addr',20, 20,1)

  lcd.text('192.168.0.1',20, 40,1)

  lcd.show()

  def fill_rect(self, x, y, w, h, col):

 

  '''



 

if __name__ == "__main__":  

    #设备初始化

    #初始化LCD

    i2c=I2C(scl=Pin(5),sda=Pin(4),freq=100000) #esp8266

    lcd=ssd1306.SSD1306_I2C(128,64,i2c)

    #初始化配置按键

    pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)

    pin.irq(trigger=Pin.IRQ_FALLING , handler=callback)

    #初始化定时器

    tim = Timer(-1)

    #声明全局变量 ,设备参数


 

    wifi_ssid = ''

    wifi_password = ''

    

    wlan = None

 

    # the device is on GPIO12 温度传感器

    dat = machine.Pin(2)

 

    # create the onewire object

    ds = ds18x20.DS18X20(onewire.OneWire(dat))

 

    

 

    #从Config中加载JSON配置文件

    config_JSON = loadConfigJSON()

    if config_JSON ==None:

        showWarning(lcd,'load cfg err')

        lcd.show()

    else:

        showWarning(lcd,'load cfg succ')

    time.sleep(2)

    #解析JSON,获得参数

    try:

        wifi_ssid = config_JSON['name']

    except:

        showWarning(lcd,'ssid no exist')

        time.sleep(2)

    try:

        wifi_password = config_JSON['password']

    except:

        showWarning(lcd,'psd no exist')

        time.sleep(2)

    

    #连接WIFI

    wlan = connectWiFi(wifi_ssid,wifi_password)

 

    if wlan == None:

        showWarning(lcd,'wifi fail')

        time.sleep(2)

    else:

        showWarning(lcd,'wifi succ')

        time.sleep(2)

    

 

    #采集数据

   





 

    while True:

        try:

             # scan for devices on the bus

            roms = ds.scan()

            ds.convert_temp()

            value = ds.read_temp(roms[0])

            showInfo(lcd,'temp:%s'%(str(value)))

 

            #获得时间

            URL="http://quan.suning.com/getSysTime.do"

            res=urequests.get(URL).text

            j=ujson.loads(res)

            tm = j['sysTime2']

            print(tm)

            print(type(tm))

            if pub(msg = '{"temperature":%s,"time":"%s"}'%(str(value),tm)) ==True:

                showWarning(lcd,'send succ')

            else:

                showWarning(lcd,'send fail')

        except:

            showWarning(lcd,'sensor error')

            pass

        time.sleep(5)

        clearlcd(lcd)




 

    pass

    

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值