信号线连接16 17脚
地址192.168.4.1
端口号一个6070
一个6068
#include <Arduino.h>
#include <WiFi.h>
#include "OneButton.h"
#define PIN_INPUT 0
OneButton button(PIN_INPUT, true);
int freq = 50; // 频率(20ms周期)
int channel = 8; // 通道(高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)
int channel1 = 9; // 通道(高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)
int resolution = 8; // 分辨率
const int led = 16;
const int led1 = 17;
extern IPAddress tcpserverIP(255,255,255,255); //目标地址
extern uint16_t tcpserverPort =6025;
uint16_t udp_port=6068; //存储需要监听的端口号
uint16_t udp_port1=6070; //存储需要监听的端口号
extern int Data_length = 0;
extern int Data_length1 = 0;
int d=0;
WiFiUDP Udp;//声明UDP对象
WiFiUDP Udp1;//声明UDP对象
char incomingPacket[255]; //存储Udp客户端发过来的数据
char incomingPacket1[255]; //存储Udp客户端发过来的数据
const char* wifi_SSID="esp32"; //存储AP的名称信息
const char* wifi_Password="123456789"; //存储AP的密码信息
void wifiinit()
{
Serial.begin(115200);
Serial.println();
//设置ESP32工作模式为无线终端模式
WiFi.mode(WIFI_STA);
WiFi.begin(wifi_SSID, wifi_Password);
delay(500);
int a =8 ;
while (WiFi.status() != WL_CONNECTED)
{
}
Serial.println("WiFi connected!");
}
void udpreceive()
{
Data_length=Udp.parsePacket(); //获取接收的数据的长度
Data_length1=Udp1.parsePacket(); //获取接收的数据的长度
if(Data_length) //如果有数据那么Data_length不为0,无数据Data_length为0
{
int len = Udp.read(incomingPacket, 255); //读取数据,将数据保存在数组incomingPacket中
Serial.println(incomingPacket);
int c=atoi(incomingPacket);
ledcWrite(channel, calculatePWM(c)); // 输出PWM
if (len > 0) //为了避免获取的数据后面乱码做的判断
{
incomingPacket[len] = 0;
}
}
if(Data_length1) //如果有数据那么Data_length不为0,无数据Data_length为0
{
int len1 = Udp1.read(incomingPacket1, 255); //读取数据,将数据保存在数组incomingPacket中
Serial.println(incomingPacket1);
int d=atoi(incomingPacket1);
ledcWrite(channel1, calculatePWM(d)); // 输出PWM
if (len1 > 0) //为了避免获取的数据后面乱码做的判断
{
incomingPacket1[len1] = 0;
}
}
}
void udpsend(IPAddress udpIP,uint16_t udpport)
{
//if(Data_length) //如果有数据那么Data_length不为0,无数据Data_length为0
//{
/*将接受到的数据发送回去*/
Udp.beginPacket(tcpserverIP,tcpserverPort); //准备发送数据到目标IP和目标端口
Serial.print("\n发送者地址:");
Serial.print("\n发送者地址端口:");
Udp.print("receive data:"); //将数据receive data:放入发送的缓冲区
Udp.println("156448"); //将接收到的数据放入发送的缓冲区
Udp.endPacket(); //向目标IP目标端口发送数据
//}
}
int calculatePWM(int degree)
{ //0-180度
//20ms周期,高电平0.5-2.5ms,对应0-180度角度
const float deadZone = 6.4;//对应0.5ms(0.5ms/(20ms/256)) 舵机转动角度与占空比的关系:(角度/90+0.5)*1023/20
const float max = 32;//对应2.5ms
if (degree < 0)
degree = 0;
if (degree > 180)
degree = 180;
return (int)(((max - deadZone) / 180) * degree + deadZone);
}
void pwmcontrol()
{
int c=atoi(incomingPacket);
ledcWrite(channel, calculatePWM(c)); // 输出PWM
int d=atoi(incomingPacket1);
ledcWrite(channel1, calculatePWM(d)); // 输出PWM
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200); //开启串口,波特率为115200
//
WiFi.softAP(wifi_SSID,wifi_Password); //打开ESP32热点
Serial.print(WiFi.softAPIP()); //串口输出模块IP地址
Udp.begin(udp_port);//启动UDP监听这个端口
Udp1.begin(udp_port1);//启动UDP监听这个端口
ledcSetup(channel, freq, resolution); // 设置通道
ledcAttachPin(led, channel); // 将通道与对应的引脚连接
ledcSetup(channel1, freq, resolution); // 设置通道
ledcAttachPin(led1, channel1); // 将通道与对应的引脚连接
button.attachClick(pwmcontrol);
}
void loop()
{
udpreceive();
udpsend(tcpserverIP,tcpserverPort);
// delay(10);
//
// button.tick();
}