**ESP8266读取ppm信号方法,远程玩具车专用
底部的代码是:读取接收机的PWM信号,再发送到服务器的中转的 **
下面的代码是可以读取到小飞象枪控或者麦克遥控器的PPM信号的.亲测有效.
这个代码不同于直接读取遥控接收机的PWM信号,而是直接使用音频线的方法读取PPM.高手自己将读取的数据发送到服务器.
我们使用免费的然也物联,也可以自己搭建EMQ的MQTT协议服务器作为中转.
服务器不会搭建的,可以找我
我们公开下面的代码是希望在采集就不会的人,大部分将采集到的数据发送到服务器是没问题的.
比如我们做过ESP8266读取小飞象X6枪控的PPM,然后发送到服务器,远程控制RC玩具车.实时性很高的.
需要完整可以远控的源代码也可以
int datachan[4][8];//建立二维数组
int x, y, chx;
int channel[8];//要输出的数组
void dataget();//获取PPM函数
void channelprint();//处理原始PPM信号的函数
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
// Serial.println(pulseIn(14, HIGH));
dataget();
channelprint();
for (int i = 0; i < 8; i++) {
Serial.println(channel[i]);//以数组形式输出最终信号
}
Serial.println("");
}
void dataget() {//接收PPM信号录入datachan数组----2号引脚
while (pulseIn(5, HIGH) < 5000) {}
for (y = 0; y < 4; y++) {
while (pulseIn(5, HIGH) < 5000) {}
for (x = 0; x < 8; x++){
datachan[y][x] = pulseIn(5, HIGH);
}
}
}
void channelprint(){//接收到的PPM信号处理对求平均
int i=0,sum=0;
for(x=0;x<8;x++){
for(y=0;y<4;y++){
sum=sum+datachan[y][x];
chx=sum/4;
sum=0;
channel[i]=chx;
i++;
}
}
}
既然都说到这里了,我的伙伴们做的另一份代码,也将公之于众.
他就是刚才说的,是读取接收机的PWM信号,再发送到服务器的中转的.
读取端代码如下:
如果您说代码不可用,请打死我,谢谢
#include
#include
#include
#include
#include
#include
// 设置wifi接入信息(根据小车要连接的WiFi信息进行修改)
WiFiServer server(80);
//MQTT服务器可以自己搭建EMQ,也可以用免费的然也物联(有点延迟、测试期推荐)
const char* mqttServer = "您服务器的公网ip";
String topicString = "ES001";//这个是订阅号,请务必保持和接收端一致
//一共修改3个地方1-服务器公网ip 2-订阅号 3-端口号(1883)
//还不会:这一串看得懂不??
// 1
// 7
// 7
// 7
// 6
// 4
// 0
// 0
// 8
// 3
// 9
Servo servoA;
Servo servoB;
Servo servoC;
//volatile uint16_t values[6] = {90};
int Avalue=90;
int Bvalue=90;
int Cvalue=90;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200); // 启动串口通讯(波特率为115200,波特率可以理解为串口传输数据的速度)
pinMode(05,OUTPUT);
pinMode(04,OUTPUT);
pinMode(00,OUTPUT);
// pinMode(15,OUTPUT);
// pinMode(13,OUTPUT);
// pinMode(12,OUTPUT);
LED();
servoA.attach(05,500,2500);
servoA.write(90);
servoB.attach(04);
servoB.write(90);
servoC.attach(00,500,2500);
servoC.write(0);
WiFiManager wifiManager;
wifiManager.autoConnect("车辆接收端配网");
Serial.println("Connected.");
server.begin();
WiFi.mode(WIFI_STA); //设置ESP8266工作模式为无线终端模式(8266像手机一样连接到wifi的模式)
connectWifi(); // 连接WiFi
mqttClient.setServer(mqttServer, 1883);// 设置MQTT服务器和端口号
mqttClient.setCallback(receiveCallback);// 设置MQTT订阅回调函数
connectMQTTserver();// 连接MQTT服务器
}
void loop() {
if (mqttClient.connected()) { // 如果开发板成功连接服务器
mqttClient.loop(); // 处理信息以及心跳
} else { // 如果开发板未能成功连接服务器
//Stop();
connectMQTTserver(); // 则尝试连接服务器
}
}
// 连接MQTT服务器并订阅信息
void connectMQTTserver() {
// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
String clientId = "esp8266-" + WiFi.macAddress();
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address:");
Serial.println(mqttServer);
Serial.println("ClientId: ");
Serial.println(clientId);
subscribeTopic(); // 订阅指定主题
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
//Stop();
delay(5000);
}
}
// 收到信息后的回调函数
char AA[4],BB[4],CC[4],DD[4],EE[4],FF[4];//储存接受到的油门和方向数据
int Alocation,Blocation,Clocation,Dlocation,Elocation,Flocation;
int TD1,TD2,TD3,TD4,TD5,TD6; //CH1 CH2 CH3 CH4 CH5 CH6
void receiveCallback(char* topic, byte* payload, unsigned int length) {
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,I=0,j=0;
analogWrite(02,180);
for ( int i = 0; i <5; i++) //CH1
{
if ((char)payload[i]!='A')
{
AA[a]=(char)payload[i];
a+=1;
}
else
{
Blocation=i;
break;
}
}
for (int i = Blocation+1; i < length; i++) //CH2
{
if ((char)payload[i]!='B')
{
BB[b]=(char)payload[i];
b+=1;
}
else
{
Clocation=i;
break;
}
}
for (int i = Clocation+1; i < length; i++) //CH3
{
if ((char)payload[i]!='C')
{
CC[c]=(char)payload[i];
c+=1;
}
else
{
Dlocation=i;
break;
}
}
for (int i = Dlocation+1; i < length; i++) //CH4
{
if ((char)payload[i]!='D')
{
DD[d]=(char)payload[i];
d+=1;
}
else
{
Elocation=i;
break;
}
}
for (int i = Elocation+1; i < length; i++) //CH5
{
if ((char)payload[i]!='E')
{
EE[e]=(char)payload[i];
e+=1;
}
else
{
Flocation=i;
break;
}
}
for (int i = Flocation+1; i < length; i++) //CH6
{
if ((char)payload[i]!='F')
{
FF[f]=(char)payload[i];
f+=1;
}
else
{
break;
}
}
TD1=String(AA).toInt();
Avalue=TD1;
TD2=String(BB).toInt();
Bvalue=TD2;
TD3=String(CC).toInt();
Cvalue=TD3;
Serial.print(Avalue);
Serial.print("\t");
Serial.print(Bvalue);
Serial.print("\t");
Serial.print(Cvalue);
Serial.println();
Go();
for (int i = 0; i < 3; i++)
{
AA[i]='\0';
BB[i]='\0';
CC[i]='\0';
DD[i]='\0';
EE[i]='\0';
FF[i]='\0';
}
analogWrite(02,0);
}
// 订阅指定主题
void subscribeTopic() {
char subTopic[topicString.length() + 1];
strcpy(subTopic, topicString.c_str());
if (mqttClient.subscribe(subTopic)) {
Serial.println("Subscrib Topic:");
Serial.println(subTopic);
analogWrite(02,180);
} else {
Serial.print("Subscribe Fail...");
analogWrite(02,0);
// Stop();
}
}
void connectWifi() {
//WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
analogWrite(02,0);
delay(1000);
//Stop();
Serial.print(".");
analogWrite(02,180);
}
Serial.println("");
Serial.println("WiFi Connected!");
Serial.println("");
analogWrite(02,180);
}
void Go(){
servoA.write(Avalue);
servoB.write(Bvalue);
servoC.write(Cvalue);
}
void LED()
{
analogWrite(02,0);
for(int i=0;i<=150;i++)
{
analogWrite(02,i);
delay(20);
}
for(int i=150;i>=0;i-=2)
{
analogWrite(02,i);
delay(20);
}
for(int i=0;i<3;i++)
{
analogWrite(02,0);
delay(180);
analogWrite(02,180);
delay(180);
}
analogWrite(02,0);
}
这个代码就是用WEB配网的,啥意思呢?就是烧录以后,手机打开WIFI列表:接收机配网
看见这个WIFI,点击配网就行。
小白发现以上代码用不了,原因是有2个库你没有安装
1-WiFiManager.h
2-PubSubClient.h
玩过arduino的都知道怎么去管理库找来安装,WiFiManager.h这个库有点麻烦,但是他是太极创客团队汉化的,当然也有英文版的,想研究透彻就百度:太极创客 进去搜WiFiManager 人家课程保姆式的。
下面安排8266的代码,这个8266做读取接收机的
#include
#include
#include
#include
#include
//MQTT服务器地址:broker.hivemq.com test.ranye-iot.net
const char* mqttServer = "您的公网服务器ip";
String topicString = "ES001";//订阅号,务必和发射端一致
const int CH1=05; //接收机1通道
const int CH2=04; //接收机2通道
const int CH3=15; //接收机3通道
const int CH4=13; //接收机4通道
const int CH5=12; //接收机5通道
const int CH6=14; //接收机6通道
int A,B,C,D,E,F;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
void setup() {
Serial.begin(115200);
pinMode(CH1,INPUT);
pinMode(CH2,INPUT);
pinMode(CH3,INPUT);
pinMode(CH4,INPUT);
pinMode(CH5,INPUT);
pinMode(CH6,INPUT);
LED();
analogWrite(16,180);// 电源指示灯
WiFiManager wifiManager;
wifiManager.autoConnect("遥控器发射端配网");
Serial.println("Connected.");
WiFi.mode(WIFI_STA);
connectWifi();
mqttClient.setServer(mqttServer, 1883);
connectMQTTServer();
}
void loop() {
if (mqttClient.connected())
{
// 如果开发板成功连接服务器
pubMQTTmsg();
analogWrite(02,180);
// 保持心跳
mqttClient.loop();
} else {
analogWrite(02,0);
connectMQTTServer();
}
}
void connectMQTTServer(){
// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
String clientId = "esp8266-" + WiFi.macAddress();
// 连接MQTT服务器
if (mqttClient.connect(clientId.c_str())) {
Serial.println("MQTT Server Connected.");
Serial.println("Server Address: ");
Serial.println(mqttServer);
Serial.println("ClientId:");
Serial.println(clientId);
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 发布信息
void pubMQTTmsg(){
static int value; // 客户端发布信息用数字
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
A=pulseIn(CH1,HIGH);
A=map(A/10,100,200,0,180);
if(A<=0){
A=0;
}else if(A>=180){
A=180;
}
B=pulseIn(CH2,HIGH);
B=map(B/10,100,200,0,180);
if(B<=0){
B=0;
}else if(B>=180){
B=180;
}
C=pulseIn(CH3,HIGH);
C=map(C/10,100,200,0,180);
if(C<180){
C=0;
}else{
C=180;
}
// D=pulseIn(CH4,HIGH);
// D=map(D/10,100,200,0,180);
D=90;
if(D<90){
D=0;
}else if(D>=90&&D<180){
D=90;
}else{
D=180;
}
// E=pulseIn(CH5,HIGH);
// E=map(E/10,100,200,0,180);
E=90;
if(E<0){
E=0;
}
// F=pulseIn(CH6,HIGH);
// F=map(F/10,100,200,0,180);
F=90;
if(F<0){
F=0;
}
// 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
String messageString = String(A)+"A"+String(B)+"B"+String(C)+"C"+String(D)+"D"+String(E)+"E"+String(F)+"F";
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现ESP8266向主题发布信息
if(mqttClient.publish(publishTopic, publishMsg)){
Serial.println(publishMsg);
analogWrite(02,180);
delay(30);
analogWrite(02,0);
delay(30);
analogWrite(02,180);
delay(30);
analogWrite(02,0);
delay(30);
} else {
Serial.println("Message Publish Failed.");
analogWrite(02,0);
}
}
// ESP8266连接wifi
void connectWifi(){
//WiFi.begin(ssid, password);
//等待WiFi连接,成功连接后输出成功信息
while (WiFi.status() != WL_CONNECTED) {
analogWrite(00,0);
delay(1000);
analogWrite(00,180);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi Connected!");
analogWrite(00,180);
Serial.println("");
}
void LED()
{
analogWrite(16,0);
analogWrite(00,0);
analogWrite(02,0);
for(int i=0;i<=150;i++)
{
analogWrite(16,i);
analogWrite(00,i);
analogWrite(02,i);
delay(20);
}
for(int i=150;i>=0;i-=2)
{
analogWrite(16,i);
analogWrite(00,i);
analogWrite(02,i);
delay(20);
}
for(int i=0;i<3;i++)
{
analogWrite(16,0);
analogWrite(00,0);
analogWrite(02,0);
delay(180);
analogWrite(16,180);
analogWrite(00,180);
analogWrite(02,180);
delay(180);
}
analogWrite(16,0);
analogWrite(00,0);
analogWrite(02,0);
}
//还不会:这一串看得懂不??
// 1
// 7
// 7
// 7
// 6
// 4
// 0
// 0
// 8
// 3
// 9
以上代码亲测可用,假代码请打死我,谢谢
如果您想要ESP8266通过音频线读取PPM波的版本:接通暗号在代码中
和大仙网控一样的,电路也可以给你提供,插上音频线自动开机,取下自动关机。
代码多的很,先分享到这里
什么8266远程控制8266之类的
ESP32控制8266之类的,摇杆手柄,按键手柄我都有
话不多说,技术交流:接通暗号在代码中