2017-10-30 11:19:02 dgut_guangdian 阅读数 25192
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3401 人正在学习 去看看 朱有鹏

1.指标:

   python上位机向单片机发送字符,单片机如果收到的字符为‘1’,则点亮灯1,如果收到的字符为‘2’,则点亮灯2;单片机若接受到字符,读取字符后,向python上位机发送字符(1->X,2->T),若python上位机接受到的字符为‘1’,则print出OK,如果字符是‘0’则printNG

2.实际效果:提供一个简易的ui让用户方便输入实现

3.准备环境:

python3、serial模块、easygui模块、单片机stc89c52

4.如果没有安装serial、easygui模块:

用管理员权限打开cmd 输入
pip install serial
pip install easygui
安装

5.正文:

import serial
import easygui

ser = serial.Serial()
ser.baudrate = 9600 #设置波特率(这里使用的是stc89c52)
ser.port = 'COM3' #端口是COM3
print(ser)
ser.open()#打开串口
print(ser.is_open)#检验串口是否打开

while(1):
    Yes_or_No = easygui.buttonbox("是否良品?", choices = ['Yes','No','退出'])#提供简易UI
    if Yes_or_No=='退出':break
    if Yes_or_No=='Yes':
        demo=b"2"#传入2的ASCII码 这里用b+str强制转换
    else:
        demo=b"1"#传入1的ASCII码 这里用b+str强制转换

    ser.write(demo)
    s = ser.read(1)
    print(s)


6.验证结果:

弹出UI供用户输入


传出后接收到单片机回传的信息


按下yes:蓝灯亮



按下No:红灯亮

2019-04-24 10:07:55 weixin_42528089 阅读数 1108
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3401 人正在学习 去看看 朱有鹏

总结:python 向单片机传送数据:data = b'Beking\r\n'    #发送的数据

          单片机向python 传送数据为数值时,以16进制进行显示 例如:12-Xoc   5-53  9-57

 

参考资料:https://blog.csdn.net/dgut_guangdian/article/details/78391270

                  https://blog.csdn.net/beking17113/article/details/83213071

                来说下用STM32串口发送数据和接收数据方式有哪些

2017-07-10 15:23:17 u010708922 阅读数 5366
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3401 人正在学习 去看看 朱有鹏

本文作者:梁中琪,广州大树信息技术有限公司嵌入式开发工程师,擅长单片机和Python开发。
本文为CSDN约稿文章,版权所有,转载请微信联系jiaweidi1214
关注物联网领域,投稿或有报道需求请邮件联系jiawd@csdn.net

Homebridge简介

Homebridge 是一个轻量级 Node.js 服务器,用 NodeJS 模拟了一个HomeKit Accessory Server,可以在家庭网络上模拟iOS HomeKit API运行。

Homebridge 逆向了 HomeKit 协议,让普通的 Wi-Fi 设备也能接入 HomeKit ,从而通过 Siri 控制。

Homebridge 的作者 KhaosT 是个在美留学的中国人,曾在苹果的 HomeKit 团队实习过。据说当 KhaosT 逆向 HomeKit 之后写了篇博客,但由于涉及到商业机密被苹果法务要求删除文章,好在代码已经早就 fork 开了所以代码才得以流传到现在。试想要是当初代码没有开源,恐怕我们现在还享受不到这一成果呢。

根据 Homebridge 文档,Homebridge可以运行在Linux、Windows和macOS等系统,那么,这里的测试平台就以树莓派为例。

Homebridge-mqtt

Homebridge-mqtt是Homebridge一个动态插件。它以MVC模式设计。Homebridge-mqtt允许你通过mqtt API添加和控制配件,进而通过苹果的HomeKit应用控制这些设备。

安装
Homebridge的安装需要npm,树莓派下安装npm有点麻烦,这里就不详细描述。安装好npm后只需按顺序输入下面语句即可安装homebridge及其相关依赖包。

sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
cd /usr/local/lib/node_modules/homebridge/
sudo npm install --unsafe-perm bignum
cd /usr/local/lib/node_modules/hap-nodejs/node_modules/mdns
sudo node-gyp BUILDTYPE=Release rebuild

接下来可以安装homebridge-mqtt了。

npm install -g homebridge-mqtt

配置
在树莓派上,Homebridge 的配置主要是编辑「/home/pi/.homebridge」下的「config.json」文件。下面是homebridge-mqtt 配置示例。

{
"bridge": {
"name": "Homebridge",
"username": "12:34:56:78:90:AB",
"port": 38960,
"pin": "123-45-678"
},
    "platforms": [{
 "platform": "mqtt",
    "name": "mqtt",
    "url": "mqtt://127.0.0.1",
    "port": 61613,
    "topic_type": "multiple",
    "topic_prefix": "homebridge",
    "username": "admin",
    "password": "password",
    "cert": "/path/to/certificate.pem",
    "key": "path/to/key.pem",
    "ca": "/path/to/ca_certificate.pem"
}]
}

其中,与 homebridge 配置相关的是 bridge 字段。name 表示 homebridge 要在 HomeKit 显示的名称;username 一般是本地主机的 MAC 地址;port 是使用的端口;pin 则是 HomeKit 配对的时候,需要输入的 pin 码。homebridge-mqtt 配置字段的含义,则参考下表。

图片描述
表1 homebridge-mqtt 配置字段含义

如果需要添加其他platform,就在「platforms」数组字段里继续添加json即可。

启动
控制台启动 homebridge 很简单,直接输入「homebridge」即可。如果需要指定配置文件路径,可以使用「-U」参数。例如:「homebridge -U ~/.homebridge」

Homebridge-mqtt的接口

Homebridge-mqtt通过MQTT提供接口(mqtt API),这些接口表征为mqtt的主题。我们可以通过这些主题做一些操作,比如添加配件或获取配件信息等等,当消息发布后 Homebridge-mqtt 会通过response主题发布消息作为响应。其实这一点非常类似于HTTP的请求/响应的思想,只不过是以MQTT的方式实现,一点也不难理解。部分mqtt API参见下表:

图片描述
表2 Homebridge-mqtt部分mqtt API

主题中有「to」字符的,表示这个主题是给我们发布消息使用,带有「from」字符的,表示我们需要订阅使用。mqtt API的负荷(Payload)采用JSON格式。

众所周知,数据库常用的操作就是增删查改。那么对 Homebridge 这个「网关」也是一样的思路。首先我们需要给Homebridge添加设备,这样我们才可以查询设备的数据,或者发送一个请求改变设备的数值,最后如果不需要设备了可以移除该设备。
在 mqtt API 中,增加操作有「添加配件」和「添加服务」,删除操作有「移除配件」和「移除服务」。如果用户端需要查询设备状态,那么可以使用

「homebridge/to/get」主题发布消息。实际上当我们从锁屏界面打开 HomeKit ,Homebridge 网关都会发送一条携带了设备状态信息的 homebridge/to/get 主题消息。

支持的service

添加配件是需要一个明确的 service,service 和苹果的HomeKit有对应的关系。比如如果service 选择了 Lightbulb,HomeKit 里会也会显示一个灯泡??的图标。下表是 Homebridge-mqtt 支持的部分 service。

图片描述
表3 Homebridge-mqtt支持的部分service

应用实例

下面是一些Homebridge-mqtt的实例。

添加配件
如果要添加配件,可以发布下面的消息:

topic: homebridge/to/add
payload: {"name": "flex_lamp", "service_name": "light", "service": "Switch"}

之后相关主题会做出下面的响应:

topic: homebridge/from/response
payload: {"ack": true, "message": "accessory 'flex_lamp' service_name 'light' is added."}

在发布消息的字段中,配件是根据 name 字段的不同来区分的,相同 name 不能重复添加。service_name 字段是设置默认出现在 HomeKit 里设备名称。service 字段上节已经说明。

移除配件

topic: homebridge/to/remove
payload: {"name": "flex_lamp"}

查询配件

topic: homebridge/to/get
payload: {"name": "flex_lamp"}

如果需要查询所有配件,可以给name字段换为星号(*)。

topic: homebridge/to/get
payload: {"name": "*"}

Homebridge操作设备
如下图,Homebridge可以理解为转发网关,使用MQTT连接一个MQTT服务器(MQTT Broker),通过MQTT服务器对设备端进行操作。

图片描述
图1 设备对接Homebridge-mqtt架构

在设备端,我们需要订阅「homebridge/from/set」主题,表示数据从(from)Homebridge出发,到达(set)订阅该主题的设备。此时,Homebridge类似于C/S架构中的client,设备端为server。

topic: homebridge/from/set
payload: {"name": "flex_lamp", "service_name": "light", "characteristic": "On", "value": true}

其中 characteristic 可以理解为特性或属性, 其根据 service 的不同而不同。一般来说,具有开关功能的 service (比如Switch、Lightbulb和Fan)都会带有「On」的 characteristic ,「On」的 value 字段只能是布尔值。而像窗户(Window)和窗帘(WindowCovering)这类 service, 可以在一个数值范围内设置开启的大小,当然这需要设备在物理层次上的支持。

Homebridge获取设备数据
如果Homebridge需要获取设备数据,可以使用「homebridge/to/set」主题。更准确地说,是其他设备主动设置值到Homebridge。此时,设备端类似于client,Homebridge为server。

控灯设备把状态发送Homebridge。

topic: homebridge/to/set
payload: {"name": "flex_lamp", "service_name": "light","characteristic": "On", "value": true}

像温度/湿度/光照传感器这类 service ,其本身不能被操作,但可以把数据发送到 Homebridge,它们 characteristic 字段根据 service 类型的不同而不同,所携带的 value 一般都是整型。

测温设备把温度发送到 Homebridge。

topic: homebridge/to/set
payload: {"name": "room_temp", "service_name": "temperature", "characteristic": "CurrentTemperature", "value": 26}

图片描述
HomeKit组图

图1HomeKit界面,图2添加配件,图3输入pin,图4识别配件,图5配件状态,图6打开light,图7添加温度传感器,图8light配件详情。

总结

当然,笔者后来思考了一下 Homebridge-mqtt 是否可以实现设备联动和第三方应用端的对接。

所谓设备联动,在Homebridge-Assistant中也称为家庭自动化。比如,如果检测到房间有人并且温度超过30度,可以自动关闭窗户并打开空调。由于没有在Homebridge-mqtt看到相关接口,所以要在 Homebridge-mqtt 实现设备联动功能恐怕有点困难。当然其实我们可能并不需要 Homebridge-mqtt,只需要MQTT服务器就可以了。我们可以自定义一些MQTT主题(topic),然后某些设备达到某条件后可以发布消息,另外一些设备订阅这些主题即可实现联动。

同理,第三方应用端控制设备同样也可以不通过 Homebridge-mqtt 接口,最简单的IoT架构就是APP+MQTT+Device。需要思考的是设备状态变化后如何通知Homebridge,在应用端或者设备端调用 Homebridge-mqtt 接口估计都是可以选择的方案。

至少,Homebridge-mqtt 把「让设备可以通过MQTT协议和Homebridge对接,并可以通过HomeKit进行控制」这一重要的功能已经实现了。如果需要更多功能,还得自己动手扩展。

图片描述

2017-03-14 09:42:39 qq_33759448 阅读数 6223
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3401 人正在学习 去看看 朱有鹏

智能家居----单片机程序(Python控制单片机)

上一篇博客介绍了树莓派的装机,这篇博客为大家介绍一下如何在树莓派中导入Python程序来控制单片机。

由于树莓派中的系统为linux系统,并且自带Python的软件。所以我们的单片机中就用Python来写控制单片机,Python控制单片机也是简单方便的。

首先让大家看一下树莓派的引脚。将继电器扩展板安装到树莓派上。



Python的程序

控制单片机无非两种形式(高电平--关闭,低电平--开启),废话不多说,直接站代码:
import time
import SimpleHTTPServer
import SocketServer
import RPi.GPIO as GPIO


PIN_CH1=37  #CH1
PIN_CH2=38  #CH2
PIN_CH3=40  #CH3
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN_CH1, GPIO.OUT)
GPIO.setup(PIN_CH2, GPIO.OUT)
GPIO.setup(PIN_CH3, GPIO.OUT)
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_POST(self):
        length = self.headers.getheader('content-length')
        try:
            nbytes = int(length)
        except (TypeError, ValueError):
            nbytes = 0
        if self.command.lower() == "post" and nbytes > 0:
            data = self.rfile.read(nbytes)
            print "--------------------------------------------------------------------------------"
            print data
            print "================================================================================"
        else:
            data = None
    def do_GET(self):
       
        DUMMY_RESPONSE = """success"""
        # http://localhost:8000?abc=100&hello=world  => 
        # self.path = "/?abc=100&hello=world"
        print self.path  
        
        if self.path == "/?on1":
            GPIO.output(PIN_CH1,GPIO.LOW)
            print "PIN_NO,GPIO.HIGH"  
        elif self.path == "/?off1":
            GPIO.output(PIN_CH1,GPIO.HIGH)
            print "PIN_NO,GPIO.LOW"  
        elif self.path == "/?on2":
            GPIO.output(PIN_CH2,GPIO.LOW)
            print "PIN_NO,GPIO.LOW"
        elif self.path == "/?off2":
            GPIO.output(PIN_CH2,GPIO.HIGH)
            print "PIN_NO,GPIO.LOW"
        elif self.path == "/?on3":
            GPIO.output(PIN_CH3,GPIO.LOW)
            print "PIN_NO,GPIO.LOW"
        elif self.path == "/?off3":
            GPIO.output(PIN_CH3,GPIO.HIGH)
            print "PIN_NO,GPIO.LOW"
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.send_header("Content-length", len(DUMMY_RESPONSE))
        self.end_headers()
        self.wfile.write(DUMMY_RESPONSE)       


myhttpd=SocketServer.TCPServer(("",8000),MyHTTPRequestHandler)
myhttpd.serve_forever()


#GPIO.cleanup()
这段代码使用Python写的简单的服务器,其中报刊post请求及get请求,将该.py文件,复制到装好系统的内存卡上,用树莓派上的python工具打开该程序并运行,获取到树莓派的ip,打开终端,输入“ifconfig -a回车后回去ip地址。
为了验证服务器是否搭建成功,你可以用与树莓派连接一个局域网的电脑打开获取到的地址,看是否有返回数据,如果有返回数据,返回的数据为“success”。说明书武器搭建成功,通过手机去访问就可以啦。
其实现在你就可以控制单片机了,连接继电器,打开电脑浏览器,输入“‘’你的树莓派ip‘’”+“/?on3”为打开第三个口的继电器。获取输入“‘’你的树莓派ip‘’”+“/?off3”为关闭第三个扣的继电器。
(注:Python用的SockServer搭建的后台)
2019-09-03 21:46:41 wangjiaweiwei 阅读数 384
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3401 人正在学习 去看看 朱有鹏

    项目中遇到需要用电脑通过串口来控制单片机IO口,查询了一些资料,可以使用python来实现简单的串口通信,

所以用python实现了一个简单的单片机串口助手,可以将串口助手发往单片机的字符回传给串口助手。也可以

将配合单片机程序对单片机进行控制。

  python实现的串口助手代码如下:

import time; #需要调用延时函数
import serial #需要调用串口库
import binascii #需要将传送的字符进行转换


if __name__ == '__main__':
    ser = serial.Serial(); #生成串口
    ser.baudrate = 4800  #设置串口波特率
    ser.port = 'COM4'    #设置串口号
    ser.timeout = 0.1    #设置串口通信超时时间
    ser.close()         #先关闭串口,以免串口被占用
    ser.open()          #打开串口
    print(ser.is_open)  #打印串口状态
    strSerial = ''      #初始化串口传输字符串
    if(ser.is_open):    
        while(strSerial != '0'):        #判断输入是否为'0',为'0'则退出循环    
            strSerial = raw_input('Input:') #输入传输字符串
            strHex = binascii.b2a_hex(strSerial)  #将传输字符串转换为16进制
            strhex = strHex.decode("hex")  #以十六进制解码,这两行必须有,不然会回传乱码
            ser.write(strhex)    #将传输字符串写入串口
            time.sleep(1)        #延时1s,时间可以设置,最好设置大点,以免传输字符过多,传输
                                 #时间过长,回传失败
            n = ser.inWaiting(); #求取串口缓存中回传的字符个数
            print 'n=',n         #打印字符个数
            if n:
                data = '';
                data = ser.read(1000); #读取缓存中1000个字符,值越大越好,如果该值小于传输字 
                                       #符总长度,多余的字符会被抛弃
                print 'get data from serial port:',data; #打印回传的字符
    ser.close()     #程序结束时关闭串口,以免串口被占用
    print  not ser.is_open

单片机下位机程序如下:

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;


u8 receiveData;

void UsartInit()//初始化串口
{
 TMOD = 0X20;
 TH1 = 0XF3;
 TL1 = 0XF3;
 PCON  = 0X80;
 TR1 = 1;
 SCON = 0X50;
 ES = 1;
 EA = 1;
 
}




void main()
{
 UsartInit();

 while(1)
 {
 };

}



void uSART() interrupt 4   //用中断处理串口通信
{
  receiveData = SBUF; //将单片机接收缓存中的字符存入receiveData

  RI = 0;
  SBUF= receiveData;  //将receiveData中的字符存入单片机发送缓存
  while(!TI);     //等待回传完成
  TI = 0;

}

程序运行结果如下:

对单片机下位机处理函数加以扩展,根据接收到的不同字符做出不同的动作,就可以通过串口助手对单片机

加以控制,以下程序可以通过串口控制单片机的IO口,将单片机的IO口与发光二极管相连,就可以控制二极管亮灭

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit SUNROOF_OPEN   = P2^0;
sbit SUNROOF_CLOSE  = P2^1;
sbit SUNSHADE_OPEN  = P2^2;
sbit SUNSHADE_CLOSE = P2^3;

u8 receiveData;

void UsartInit()
{
 TMOD = 0X20;
 TH1 = 0XF3;
 TL1 = 0XF3;
 PCON  = 0X80;
 TR1 = 1;
 SCON = 0X50;
 ES = 1;
 EA = 1;
 
}




void main()
{
 UsartInit();
 P2 = 0; //P2口先置0,发光二极管全灭

 while(1)
 {
   switch(receiveData)//根据接收到的值控制对应的IO口输出高低电平
   {
   case 'A'
    SUNROOF_OPEN = 1;
	break;
   case 'B':
    SUNROOF_OPEN = 0;
	break;
   case 'C':
    SUNROOF_CLOSE = 1;
	break;
   case 'D':
    SUNROOF_CLOSE = 0;
	break;
   case 'E':
    SUNSHADE_OPEN = 1;
	break;
   case 'F':
    SUNSHADE_OPEN = 0;
	break;
   case 'G':
    SUNSHADE_CLOSE = 1;
	break;
   case 'H':
    SUNSHADE_CLOSE = 0;
	break;
   default:
    break;
    
     

   }
 
 

 };
}



void uSART() interrupt 4
{
  receiveData = SBUF;

  RI = 0;
  SBUF= receiveData;
  while(!TI);
  TI = 0;

}

程序运行结果如下:

串口助手发送命令:

单片机做出响应:

串口再次发送命令:

单片机再次做出响应:

可以对单片机和串口助手程序加以扩展,实现更复杂的功能

python 串口效率测试

阅读数 2098

刚接触python

阅读数 3

Python To STC15W

阅读数 155

做Python 到 单片机STC15W 的自动控制

博文 来自: weixin_42849193
没有更多推荐了,返回首页