stm32 esp01s Qt 巴法云平台控制小灯
最近一直在想着用esp01s和stm32做个控制的东西,现在先把现在做好的一部分写出来,巴法云平台我觉得是一个不错物联网平台,接口文档资料都十分清晰。
这个demo是esp1s和stm32串口通信,然后qt上位机和esp01s是tcp通信
这样就可以实现远程控制led
首先准备esp01s,stm32f10c8t6,led,Qt Creator等工具
一般刚买的esp01s是没有下载AT的,所以你先下载好AT固件,然后用串口助手测试一下
这样就说明AT固件安装成功了
然后打开巴法云平台巴法云,根据文档新建一个tcp创客云主题
我这里起的名字叫testesp
接着连接硬件
Esp01SRx-stm32 Tx
Esp01STx-stm32 Rx
Esp01SEN-VCC
Esp01SVCC-VCC
Esp01SGND-GND
LED的灯自定义一个GPIO引脚然后自己连接就好
然后编写stm32的驱动代码
Serial_Init();
Led_Init();
Serial_SendString("AT+RST\r\n");
Delay_ms(1000);
Serial_SendString("AT+CWMODE=3\r\n");
Delay_ms(1000);
Serial_SendString("AT+CWJAP=\"123\",\"12345678\"\r\n");
Delay_ms(2000);
Serial_SendString("AT+CIPMODE=1\r\n");
Delay_ms(1000);
Serial_SendString("AT+CIPSTART=\"TCP\",\"bemfa.com\",8344\r\n");
Delay_ms(1000);
Serial_SendString("AT+CIPSEND\r\n");
Delay_ms(1000);
Serial_SendString("cmd=1&uid=9dc59b8dbf234949842d49575bf6f4db&topic=testesp\r\n");
while (1){
if (Serial_RxFlag == 1){
if (strstr((const char*)Serial_RxPacket,"onled"))
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
}else if(strstr((const char*)Serial_RxPacket,"offled")){
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
Serial_RxFlag = 0;
}
}
接着是qt的代码:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
TcpInit();
}
Widget::~Widget()
{
delete ui;
}
void Widget::TcpInit()
{
tcpSocket=new QTcpSocket(this);
connect(tcpSocket,&QTcpSocket::readyRead,
this,&Widget::onReadMessage);
connect(tcpSocket,SIGNAL(QAbstractSocket::SocketError),
this,SLOT(onDisplayError(QAbstractSocket::SocketError)));
}
void Widget::onReadMessage()
{
QByteArray bt;
bt.resize(tcpSocket->bytesAvailable());
tcpSocket->read(bt.data(),bt.size());
//将客户端反馈的数据显示到标签上
ui->label->setText(bt);
}
void Widget::onDisplayError(QAbstractSocket::SocketError e)
{
qDebug()<<"SocketError:"<<e<<endl
<<tcpSocket->errorString();
}
void Widget::on_btnconn_clicked()
{
tcpSocket->abort();
//连接服务端
tcpSocket->connectToHost("bemfa.com",8344);
QString str = "cmd=1&uid=9dc59b8dbf234949842d49575bf6f4db&topic=testesp\r\n";
tcpSocket->write(str.toUtf8());
}
void Widget::on_btnled_clicked()
{
QString orderon ="cmd=2&uid=9dc59b8dbf234949842d49575bf6f4db&topic=testesp&msg=onled\r\n";
QString orderoff ="cmd=2&uid=9dc59b8dbf234949842d49575bf6f4db&topic=testesp&msg=offled\r\n";
QString strButFlag = ((QPushButton*)sender()) -> text();
if(strButFlag == "开灯")
{
ui->btnled-> setText("关灯");
QByteArray str = orderon.toUtf8();
tcpSocket->write(str);
}
else
{
ui->btnled -> setText("开灯");
QByteArray str = orderoff.toUtf8();
tcpSocket->write(str);
}
}
是不是很简单,通过发送命令"on"/“off"给云,然后云发给esp01s,esp01s发给stm32,stm32判断云发的数据有没有"on"/"off"然后执行相应的代码
这样就可以实现控制led小灯了,进而你控制别的硬件都可以,主题思路就是这些,边边角角需要你自己探索,埋个伏笔,我最近一直在想传感器如何上传数据给qt界面这里