Proteus仿真实现阿里云物联网方案(Proteus仿真)

        Proteus是一款经典的单片机仿真软件,该软件功能强大,但是也有其限制,Proteus不提供WIFI模块等网络模块扩展网络功能,但是在实际使用中,我们真的无法在Proteus中实现网络功能吗?答案是否定的,Proteus有一个非常灵活的器件,那就是串口(COMPIM),结合虚拟串口,COMPIM可以和电脑通信,这时我们可以使用python写一个脚本,接受虚拟串口数据,然后使用我们计算机连接的网络发送到阿里云平台,此时我们的电脑充当了一个网关的作用,通过这种方式我们就实现了Proteus连接到阿里云平台。本次设计需要写三个代码,分别是Protues端、Python网关、Python UI。

一、实现步骤

1、Proteus端

        首先我们需要在Proteus上创建一个简单的的仿真项目,只有两个部分分别是一个滑动变阻器,用于模拟传感器,一个COMPIM,并配置好虚拟串口。

        然后我们测试一下,STM32读取ADC是否正确,使用串口调试助手,查看一下数据。如下图,当串口循环打印234(不换行),表示本次数据获取正确。

参考代码如下:

#include "stm32f10x.h"
#include "stdio.h"
#include "bsp_SysTick.h"
#include "system.h"
#include "usart.h"
#include "bsp_clkconfig.h"
#include "bsp_mcooutput.h"
#include "LCD1602.h"
#include "Light.h"
#include "stm32f10x_tim.h"
#include "Light.h"
#include "Key.h"
#include "Led.h"
#include "Timer.h"
#include "stm32f10x_it.h"

uint16_t val=0;


void delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//璁剧疆瀹氭椂鍣ㄩ噸瑁呭€?
	SysTick->VAL = 0x00;					//娓呯┖褰撳墠璁℃暟鍊?
	SysTick->CTRL = 0x00000005;				//璁剧疆鏃堕挓婧愪负HCLK锛屽惎鍔ㄥ畾鏃跺櫒
	while(!(SysTick->CTRL & 0x00010000));	//绛夊緟璁℃暟鍒?
	SysTick->CTRL = 0x00000004;				//鍏抽棴瀹氭椂鍣?
}

void delay_ms(uint32_t xms)
{
	while(xms--)
	{
		delay_us(1000);
	}
}

uint16_t cnt=0;

int main(void)
{
	int i=0;
	RCC_ClocksTypeDef RCC_Clocks;			//时钟结构体
	HSE_SetSysClock(RCC_PLLMul_7);			//8*7=56Mhz,库函数默认多数为72MHZ。此处设置为56M,主要是因为发现72M时proteus仿真串口容易出现乱码。
	RCC_GetClocksFreq(&RCC_Clocks);		//获取片上时钟	
	MCO_GPIO_Config();								//MCO配置,PA8输出波形,可用示波器观察
	RCC_MCOConfig(RCC_MCO_SYSCLK);		//MCO选择输出的时钟
	SysTick_Init();									//嘀嗒时钟初始化
	Led_Init();
	usart_init();
	Light_Init();
	while(1)
	{	
		val = ((float)Light_GetValue()/4095*330);
		if(++cnt >= 700){
			cnt=0;
			printf("%d", val);
		}
		delay_ms(200);
	}
}


2、Python网关端

        Python网关端需要用到的包大致为pyserial和MQTT,通过串口获取到虚拟串口发送过来的数据,然后连接MQTT,将虚拟串口转发而来的数据进行上传。

        (1)首先,我们需要在注册一个阿里云,点开物联网平台。

        (2)创建一个物联网产品,并且在里面创建两个设备。light是连接Proteus的设备,MQTT_fx是连接Python UI的设备。

        (3)连接阿里云平台,我们需要获取阿里云注册产品和设备时的三元组,在阿里云平台上获取并在python中以字典的方式存储,如下图:

options = {
    'productKey': '',
    'deviceName': '',
    'deviceSecret': '',
    'regionId': 'cn-shanghai'
}

         (4)然后,我们需要通过虚拟串口连接Proteus,并接受数据,然后上传到阿里云平台。参考代码如下:

import paho.mqtt.client as mqtt
import hashlib
import hmac
import serial
import time

serial = serial.Serial("COM2", 115200, timeout=0.5)

# 这个就是我们在阿里云注册产品和设备时的三元组啦
# 把我们自己对应的三元组填进去即可
options = {
    'productKey': '',
    'deviceName': '',
    'deviceSecret': '',
    'regionId': 'cn-shanghai'
}

HOST = options['productKey'] + '.iot-as-mqtt.' + options['regionId'] + '.aliyuncs.com'
PORT = 1883
PUB_TOPIC = "/sys/" + options['productKey'] + "/" + options['deviceName'] + "/thing/event/property/post";

def hmacsha1(key, msg):
    return hmac.new(key.encode(), msg.encode(), hashlib.sha1).hexdigest()


def getAliyunIoTClient():
    timestamp = str(int(time.time()))
    CLIENT_ID = "paho.py|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|"
    CONTENT_STR_FORMAT = "clientIdpaho.pydeviceName" + options['deviceName'] + "productKey" + options[
        'productKey'] + "timestamp" + timestamp
    # set username/password.
    USER_NAME = options['deviceName'] + "&" + options['productKey']
    PWD = hmacsha1(options['deviceSecret'], CONTENT_STR_FORMAT)
    client = mqtt.Client(client_id=CLIENT_ID, clean_session=False, callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
    client.username_pw_set(USER_NAME, PWD)
    return client

def recv(serial):
    while True:
        dat = serial.readline()
        if dat == '':
            continue
        else:
            break
    return dat

if __name__ == '__main__':

    if serial.isOpen():
        print("Serial COM2 Success!")
    else:
        print("Serial COM2 Failed!")

    client = getAliyunIoTClient()
    client.connect(HOST, 1883, 300)
    while True:
        dat = serial.readline()
        if dat != b'':
            dat = int(dat)
            dat = dat*1.0/100
            final_string = f'{{"voltage":{dat}}}'
            client.publish("/k0ehplCy1Mt/light/user/update", final_string, 0)
            print("Send", dat)
        time.sleep(0.2)

3、阿里云产品流转

        (1)在阿里云平台上再注册一个设备,该设备用于连接到我们的PythonUI,我们设备的名字叫做 MQTT_fx.

          (2)创建云产品流转规则,本次云产品流转规则名字叫做IOT1,如下图:

        (3)编写SQL语句,进行topic之间的流转。

4、Python UI端口

        PythonUI端有两个功能,一个是从阿里云获取数据,不同于Proteus端,PythonUI端需要连接另一个设备,另一个是PyQT显示。

        (1)首先,我们需要连接到阿里云Mqtt_fx端,同样利用三元组,然后获取topic的数据,数据格式一般是json,本地对其进行解析,得到数据,然后让其显示在QT设计的前端窗口。代码如下所示:

    def on_message(self, mqttc, obj, msg):
        print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
        self.label3set("设备状态:在线")
        dat = str(msg.payload)
        self.qle.append("接收数据\n" + dat)
        dat = dat.lstrip("b")
        # 查找冒号的位置
        colon_index = dat.index(':')
        # 提取冒号后的部分,并去除可能的空格
        number_part = dat[colon_index + 1:].strip()
        number_part = number_part.rstrip("}'")
        # 输出结果
        print(number_part)

        text = "电压:" + number_part

        (2)然后就是数据显示,本次设计了一个线程进行数据获取,同时设置mqtt的 on_mssage 函数,当阿里云有数据发送过来的时候 on_mssage 函数就会自动执行。

    def on_message(self, mqttc, obj, msg):
        print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
        self.label3set("设备状态:在线")
        dat = str(msg.payload)
        self.qle.append("接收数据\n" + dat)
        dat = dat.lstrip("b")
        # 查找冒号的位置
        colon_index = dat.index(':')
        # 提取冒号后的部分,并去除可能的空格
        number_part = dat[colon_index + 1:].strip()
        number_part = number_part.rstrip("}'")
        # 输出结果
        print(number_part)

        text = "电压:" + number_part + "V"
        self.label6.setText(text)

        

二、实现效果

        1、运行Proteus

                运行Protues,可以看到 COMPIM 的 TXD 在不断闪烁,说明此时STM32在给虚拟串口发送数据。

                

        2、运行Python网关

                运行Python网关,控制台会打印数据,这是Python网关发送给阿里云平台的数据,上传到阿里云的topic。

        3、运行Python UI

                运行Python UI可以看到设备状态、日志、电压、服务器状态,当我们运行了Proteus仿真,此时这几个值会进行显示,改变Proteus的值,Python UI的电压值会改变。

                如果关闭Python网关,此时Python UI会显示设备离线,因为此时Python网关已经不工作了,Proteus无法连接到阿里云平台,但是服务器还是运行的,所以服务器状态是已连接。

三、项目总结

        本次项目实现了Proteus联网,由于Proteus自生并没有WIFI模块,所以我们使用COMPIM进行,借助虚拟串口连接到我们写的Python脚本,借助计算机的网络连接到阿里云平台,阿里云平台进行数据流转将数据转发到另一个设备的topic,同时Python UI读取到数据显示在界面上。

以下是演示地址:

Proteus可以做物联网项目哦_哔哩哔哩_bilibili

目录 介绍 1 什么是IOT Builder ? 1 IOT Builder的开发目标 2 关于本文档 3 向导 4 综述 4 项目树 4 编辑窗口 6 图形面板 7 调色板 8 缩放和导航 9 网格和捕捉 10 教程1:点亮LED 11 介绍 11 项目设置 11 设计前面板 12 编写程序 18 仿真和测试 21 应用程序 24 编程下载 27 控制硬件 30 教程2:记录温度计 31 介绍 31 前面板设计 31 编写固件(流程图) 39 仿真 52 调试 54 部署 60 源代码项目 62 介绍 62 新建项目向导 62 设计阶段 63 硬件编程 66 概述 66 Arduino Yun via SSH 66 Arduino Yun via USB 67 计算机/网络/实验室设置 68 将Arduino Yun设置到您的网络上 69 移动应用程序 71 概述 71 下载和安装 71 发现 71 面板设计进阶 73 虚拟前面板如何工作 73 使用Inkscape编辑面板 73 控制编辑 75 按钮 78 介绍 78 设计时的配置 79 编程指令 82 开关 84 介绍 84 设计时的配置 85 编程指令 88 显示 90 介绍 90 设计时的配置 91 编程指令 95 指示器 96 介绍 96 设计时的配置 96 编程指令 98 表盘和滑块 99 介绍 99 设计时的配置 99 编程指令 101 警报 102 使用警报框 102 设计时的属性和编程指令 103 文本框和终端 104 介绍 104 文本输入控制 104 电传打字机终端控制 105 文本日志控制 105 时钟和计时器 106 介绍 106 了解时间 106 时钟属性 108 计时器属性 109 线图 111 介绍 111 设计时的属性 111 编程指令 112 条形图 113 介绍 113 设计时的配置 113 编程指令 114 直方图 116 介绍 116 设计时的属性 116 编程指令 117 风玫瑰控件 118 介绍 118 设计时的配置 118 编程指令 120
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值