ESP32C3最好的socket入门例程----基于socket通信的摇杆位置校正显示

这篇文章介绍了如何使用ESP32和ArduinoUno开发一个结合WiFi接入点、Web服务器以及WebSocket的系统,实现实时的摇杆控制并更新HTML页面上的动态坐标。
摘要由CSDN通过智能技术生成

在这里插入图片描述

#include <WiFi.h>
#include <WebServer.h>
#include <WebSocketsServer.h>

// 定义摇杆通道1的ADC值
int joystickChannel1Raw = 0;           // 第一个摇杆通道的原始ADC值
int joystickChannel1Smooth = 0;        // 第一个摇杆通道的平滑输出值
int joystickChannel1Min = 0x7fffffff;  // 定义ADC最小值
int joystickChannel1Center = 2048;     // 摇杆置中时的ADC值
int joystickChannel1Max = 0;           //定义ADC最大值
int joystickChannel1Out = 0;           // 摇杆1最终输出值
// 定义摇杆通道2的ADC值
int joystickChannel2Raw = 0;           // 第二个摇杆通道的原始ADC值
int joystickChannel2Smooth = 0;        // 第二个摇杆通道的平滑输出值
int joystickChannel2Min = 0x7fffffff;  //定义ADC最小值
int joystickChannel2Center = 0;        // 定义ADC中间值
int joystickChannel2Max = 0;           //定义ADC最大值
int joystickChannel2Out = 0;           // 摇杆2最终输出值
// 设置WiFi接入点的SSID和密码
const char* ssid = "ESP32_AP";
const char* password = "12345678";



// 创建Web服务器和WebSocket服务器实例
WebServer server(80);
WebSocketsServer webSocket = WebSocketsServer(81);
void ADCcompu() {
  static uint32_t ADCadd;
  joystickChannel1Raw = analogRead(2);
  joystickChannel2Raw = analogRead(3);
  joystickChannel1Smooth = joystickChannel1Raw + joystickChannel1Smooth * 0.95;
  joystickChannel2Smooth = joystickChannel2Raw + joystickChannel2Smooth * 0.95;

  if (ADCadd == 0-1) {
    if (joystickChannel1Min > joystickChannel1Smooth)
      joystickChannel1Min = joystickChannel1Smooth;
    if (joystickChannel1Max < joystickChannel1Smooth)
      joystickChannel1Max = joystickChannel1Smooth;
    if (joystickChannel2Min > joystickChannel2Smooth)
      joystickChannel2Min = joystickChannel2Smooth;
    if (joystickChannel2Max < joystickChannel2Smooth)
      joystickChannel2Max = joystickChannel2Smooth;
  } else if (ADCadd == 200) {
    joystickChannel1Center = joystickChannel1Smooth;
    joystickChannel2Center = joystickChannel2Smooth;
    ADCadd = 0-1;
  } else
    ADCadd++;

  if (joystickChannel1Center < joystickChannel1Smooth)  //中间值处理
    joystickChannel1Out = map(joystickChannel1Smooth, joystickChannel1Center, joystickChannel1Max, 0, 1000);
  else
    joystickChannel1Out = map(joystickChannel1Smooth, joystickChannel1Min, joystickChannel1Center, -1000, 0);

  if (joystickChannel2Center < joystickChannel2Smooth)  //中间值处理
    joystickChannel2Out = map(joystickChannel2Smooth, joystickChannel2Center, joystickChannel2Max, 0, 1000);
  else
    joystickChannel2Out = map(joystickChannel2Smooth, joystickChannel2Min, joystickChannel2Center, -1000, 0);
}
void setup() {
  Serial.begin(115200);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  analogSetAttenuation(ADC_11db);
  // 初始化WiFi接入点
  delay(100);
  WiFi.softAP(ssid);
  for (int i = 0; i < 256; i++)
    ADCcompu();
  delay(100);
  // 打印接入点的IP地址
  Serial.println();
  Serial.print("AP IP address: ");
  Serial.println(WiFi.softAPIP());

  // 设置Web服务器处理根URL请求
  server.on("/", handleRoot);

  // 启动WebSocket服务器
  webSocket.begin();
  Serial.println("WebSocket server started.");

  // 启动Web服务器
  server.begin();
  Serial.println("HTTP server started.");
}

void loop() {
  ADCcompu();
  // 处理WebSocket客户端连接
  webSocket.loop();

  // 处理Web服务器请求
  server.handleClient();

  // 每秒发送两个随机数
  static unsigned long lastTime = 0;
  if (millis() - lastTime >= 10) {
    lastTime = millis();
    sendRandomCoordinates();
  }
}

void handleRoot() {
  // 发送HTML页面内容
  String html = "<html><body><div style='position:relative;width:1080px;height:1080px;border:1px solid black;'>";
  html += "<div id='circle' style='position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:50px;height:50px;border-radius:50%;background-color:blue;'></div>";
  html += "</div><script>";
  html += "var circle = document.getElementById('circle');";
  html += "var socket = new WebSocket('ws://' + window.location.hostname + ':81/');";
  html += "socket.onmessage = function(event) {";
  html += "var data = JSON.parse(event.data);";
  html += "circle.style.left = data.x + 'px';";
  html += "circle.style.top = data.y + 'px';";
  html += "};";
  html += "</script></body></html>";
  server.send(200, "text/html", html);
}

void sendRandomCoordinates() {
  // 生成两个随机数(假设正方形大小为300x300,圆圈大小为50x50)
  int x = map(joystickChannel2Out, -1000, 1000, 50, 1030);
  int y = map(joystickChannel1Out, -1000, 1000, 1030, 50);

  // 创建JSON格式的字符串
  String data = "{\"x\":";
  data += x;
  data += ",\"y\":";
  data += y;
  data += "}";

  // 发送数据到所有连接的WebSocket客户端
  webSocket.broadcastTXT(data);
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这里提供一个基于 ESP-IDF 4.4.4 的 ESP32-C3 和 CH623 刷卡芯片之间的 SPI 通信例程。 ```c #include <stdio.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_spi_flash.h" #include "driver/spi_master.h" // SPI相关配置 #define PIN_NUM_MISO 4 #define PIN_NUM_MOSI 2 #define PIN_NUM_CLK 0 #define PIN_NUM_CS 5 #define SPI_DMA_CHANNEL 1 #define CH623_CMD_READ_REGISTER 0x80 #define CH623_CMD_WRITE_REGISTER 0x81 // CH623寄存器相关定义 #define CH623_REG_VERSION 0x00 #define CH623_REG_IRQ_MASK 0x01 #define CH623_REG_IRQ_STATUS 0x02 #define CH623_REG_CONTROL 0x03 #define CH623_REG_TX_FIFO 0x04 #define CH623_REG_RX_FIFO 0x05 #define CH623_CONTROL_RESET 0x01 #define CH623_IRQ_MASK_ALL 0xFF // SPI总线句柄 spi_device_handle_t spi; // 初始化SPI总线 void init_spi_bus() { esp_err_t ret; spi_bus_config_t buscfg={ .miso_io_num=PIN_NUM_MISO, .mosi_io_num=PIN_NUM_MOSI, .sclk_io_num=PIN_NUM_CLK, .quadwp_io_num=-1, .quadhd_io_num=-1, .max_transfer_sz=0 }; spi_device_interface_config_t devcfg={ .command_bits=8, .address_bits=0, .dummy_bits=0, .mode=0, .duty_cycle_pos=128, .cs_ena_pretrans=0, .cs_ena_posttrans=0, .clock_speed_hz=1000000, .input_delay_ns=0, .spics_io_num=PIN_NUM_CS, .flags=0, .queue_size=1, .pre_cb=NULL, .post_cb=NULL, .tx_buffer=NULL, .rx_buffer=NULL, .use_dma=1, .dma_channel=SPI_DMA_CHANNEL, }; ret = spi_bus_initialize(HSPI_HOST, &buscfg, SPI_DMA_CHANNEL); assert(ret==ESP_OK); ret=spi_bus_add_device(HSPI_HOST, &devcfg, &spi); assert(ret==ESP_OK); } // 读取CH623寄存器 uint8_t ch623_read_reg(uint8_t reg_addr) { uint8_t tx_buf[2], rx_buf[2]; tx_buf[0] = CH623_CMD_READ_REGISTER; tx_buf[1] = reg_addr; spi_transaction_t t = { .length=16, .tx_buffer=tx_buf, .rx_buffer=rx_buf, .flags=SPI_TRANS_USE_RXDATA, }; esp_err_t ret = spi_device_polling_transmit(spi, &t); assert(ret == ESP_OK); return rx_buf[1]; } // 写CH623寄存器 void ch623_write_reg(uint8_t reg_addr, uint8_t value) { uint8_t tx_buf[3], rx_buf[3]; tx_buf[0] = CH623_CMD_WRITE_REGISTER; tx_buf[1] = reg_addr; tx_buf[2] = value; spi_transaction_t t = { .length=24, .tx_buffer=tx_buf, .rx_buffer=rx_buf, .flags=SPI_TRANS_USE_RXDATA, }; esp_err_t ret = spi_device_polling_transmit(spi, &t); assert(ret == ESP_OK); } void app_main(void) { // 初始化SPI总线 init_spi_bus(); // 复位CH623 ch623_write_reg(CH623_REG_CONTROL, CH623_CONTROL_RESET); // 读取CH623版本寄存器 uint8_t version = ch623_read_reg(CH623_REG_VERSION); printf("CH623 version: %02X\n", version); // 设置中断屏蔽寄存器 ch623_write_reg(CH623_REG_IRQ_MASK, CH623_IRQ_MASK_ALL); } ``` 这个例程中,我们使用 ESP-IDF 提供的 SPI Master 驱动程序来进行 SPI 通信,使用 CH623 的 SPI 协议读写寄存器,实现了读取版本号、复位、设置中断屏蔽等基本操作。注意,这里的例程仅供参考,实际使用时需要根据具体的硬件接口和寄存器配置进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值