这个是通过wifi通信的方式,esp8266作为客户端,上位机服务器端用QT平台实现
下位机界面如下:
通过输入端口号,按下连接按钮监听8080端口,如果有连接则下面显示client的ip地址等信息,连接成功后就可以实现操作了。
实物图片如下:
这块我本来还想实现传感器等数据的上传,但遇到一个问题,向服务器发送数据的write函数好像在一旦有传感器数据计算就会把这个连接堵住一样,数据不完整,还会使得下位机接收服务器的数据变慢,但是只要测试单个字符比如wirte(‘a’)这样可以不影响,但会出现一个大量数据聚集,就是第一次发一个a,第二次发几十个a,如此循环,我觉得下位机的while循环有问题吧,弄了两天也没找出来原因,我就光控制吧,如果您有建议请赐教哈
下位机代码:
#include <ESP8266WiFi.h>
#include <Servo.h>
//定义Servo对象来控制
Servo myServo;
//角度存储变量
int pos = 0;
#define AP_SSID "MERCURY_400F" //所用WiFi的名字
#define AP_PSW "12345678" //所用WiFi的密码
//D5 灯引脚
#define LED 14
//D0 蜂鸣器引脚
#define BUZZER 16
//D1 舵机引脚
#define Sero 5
const uint16_t port = 8080; //Tcp 服务器的端口
const char * host = "192.168.0.103"; //Tcp 服务器的ip地址
static String val = "";
WiFiClient client; //创建一个tcp client连接
void setup() {
//舵机初始化
myServo.attach(Sero);
//灯初始化
pinMode(LED,OUTPUT);
digitalWrite(LED,0);
//蜂鸣器初始化
pinMode(BUZZER,OUTPUT);
digitalWrite(BUZZER,1);
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //设置WiFi 为 Station 模式
WiFi.begin(AP_SSID,AP_PSW); //连接WiFi
Serial.println("Connecting to WiFi... ");
//等待wifi连接成功
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Failed!");
delay(500);
}
Serial.println("");
Serial.println("Connected");
Serial.println("Local IP: ");
Serial.println(WiFi.localIP());
Serial.println("Connecting to TCP Server :");
Serial.println(host);
if (!client.connect(host, port)) {
Serial.println("Failed");
return;
}
}
void ActiveP(){
for (pos = 0; pos <= 360; pos ++) { // 0°到180°
// in steps of 1 degree
myServo.write(pos); // 舵机角度写入
}
}
void ActiveD(){
for (pos = 360; pos >= 0; pos --) { // 从180°到0°
myServo.write(pos); // 舵机角度写入
}
}
void loop(){
while (client.available()){
while (client.available() > 0) // 串口收到字符数大于零。
{
val += char(client.read());
}
if(val=="12"){
digitalWrite(LED,1);
}else if(val=="13"){
digitalWrite(LED,0);
}else if(val=="14"){
digitalWrite(BUZZER,0);
}else if(val=="15"){
digitalWrite(BUZZER,1);
}else if(val=="16"){
ActiveP();
}else if(val=="17"){
ActiveD();
}
val="";//清空数据
}
}