基于ESP32的遥控小车

news2024/9/25 17:21:58

目录

1.ESP32简介

2.项目构思

3.项目所需材料

4.代码示例

5.实物运行


1.ESP32简介

ESP32是一个集成天线和射频巴伦、功率放大器、低噪声放大器、滤波器和电源管理模块。整个解决方案占用的印刷电路板面积最少。该板采用台积电40nm低功耗技术的2.4GHz双模Wi-Fi和蓝牙芯片,功率和射频性能最佳,安全可靠,可扩展到各种应用。

2.项目构思

使用esp32连接到本地局域网,通过控制高低电信号的输入和输出,实现对马达前进后退与停止的控制。

3.项目所需材料

ESP32开发板*1

130电机DC3V*2

L298N电机驱动板*1

导线若干

输出功率为5V3A的移动电源

4.代码示例

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

// 马达A
int motor1Pin1 = 27; 
int motor1Pin2 = 26; 
int enable1Pin = 14; 

// 马达B
int motor2Pin1 = 33; 
int motor2Pin2 = 32; 
int enable2Pin = 25; 

// 替换成你的WiFi信息
const char* ssid = "名称";
const char* password = "密码";

// 开放80端口
AsyncWebServer server(80);

//web界面的格式和信息
const char index_html[] PROGMEM = R"rawliteral(
  <!DOCTYPE html>
  <html>
    <head>
      <title>ESP IOT DASHBOARD</title>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <link rel="stylesheet" type="text/css" href="style.css">
      <link rel="icon" type="image/png" href="favicon.png">
      <script src="https://kit.fontawesome.com/0294e3a09e.js" crossorigin="anonymous"></script>
      <style>
      html {
      font-family: Arial, Helvetica, sans-serif;
      text-align: center;
      }
      h1 {
          font-size: 1.8rem;
          color: white;
      }

      .topnav {
          overflow: hidden;
          background-color: #0A1128;
      }
      body {
          margin: 0;
      }
      .content {
          padding: 50px;
      }
      .card-grid {
          max-width: 800px;
          margin: 0 auto;
          display: grid;
          grid-gap: 2rem;
          grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      }
      .card {
          background-color: white;
          box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5);
      }
      .card-title {
          font-size: 1.2rem;
          font-weight: bold;
          color: #034078
      }
      .state {
          font-size: 1.2rem;
          color:#1282A2;
      }
      button {
          border: none;
          color: #FEFCFB;
          padding: 15px 32px;
          text-align: center;
          font-size: 16px;
          width: 150px;
          border-radius: 4px;
          transition-duration: 0.4s;
      }
      .button-on {
          background-color:#034078;
      }
      .button-on:hover {
          background-color: #1282A2;
      }
      .button-off {
          background-color:#858585;
      }
      .button-off:hover {
          background-color: #252524;
      }
      .button-stop {
          background-color:#5e0f0f;
          width: 100%;
      }
      .button-stop:hover {
          background-color: #9b332c;
      }
      </style>
    </head>
    <body>
      <div class="topnav">
        <h1>CONTROL DC MOTORS</h1>
      </div>
      <div class="content">
        <div class="card-grid">
          <div class="card">
            <p class="card-title"><i class="fa-solid fa-gear"></i> DC Motor A</p>
            <p>
              <a href="forwardA"><button class="button-on"><i class="fa-solid fa-arrow-up"></i> FORWARD</button></a>
              <a href="backwardA"><button class="button-off"><i class="fa-solid fa-arrow-down"></i> BACKWARD</button></a>
            </p>
            <p>
              <a href="stopA"><button class="button-stop"><i class="fa-solid fa-stop"></i> STOP</button></a>
            </p>
          </div>
          <div class="card">
            <p class="card-title"><i class="fa-solid fa-gear"></i> DC Motor B</p>
            <p>
              <a href="forwardB"><button class="button-on"><i class="fa-solid fa-arrow-up"></i> FORWARD</button></a>
              <a href="backwardB"><button class="button-off"><i class="fa-solid fa-arrow-down"></i> BACKWARD</button></a>
            </p>
            <p>
              <a href="stopB"><button class="button-stop"><i class="fa-solid fa-stop"></i> STOP</button></a>
            </p>
          </div>
        </div>
      </div>
    </body>
</html>
)rawliteral";
//连接WiFi
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}
//A马达前进
void moveForwardA(){
  Serial.println("Motor A Moving Forward");
  digitalWrite(enable1Pin, HIGH);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH);
}
//A马达后退
void moveBackwardA(){
  Serial.println("Motor A Moving Backward");
  digitalWrite(enable1Pin, HIGH);
  digitalWrite(motor1Pin1, HIGH);
  digitalWrite(motor1Pin2, LOW);
}
//A马达停止
void stopMotorA(){
  Serial.println("Motor A Stopped");
  digitalWrite(enable1Pin, LOW);
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
}
//B马达前进
void moveForwardB(){
  Serial.println("Motor B Moving Forward");
  digitalWrite(enable2Pin, HIGH);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, HIGH);
}
//B马达后退
void moveBackwardB(){
  Serial.println("Motor B Moving Backward");
  digitalWrite(enable2Pin, HIGH);
  digitalWrite(motor2Pin1, HIGH);
  digitalWrite(motor2Pin2, LOW);
}
//B马达停止
void stopMotorB(){
  Serial.println("Motor B Stopped");
  digitalWrite(enable2Pin, LOW);
  digitalWrite(motor2Pin1, LOW);
  digitalWrite(motor2Pin2, LOW);
}

void setup() {
  Serial.begin(115200);

  // Set motor pins as outputs
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  pinMode(motor2Pin1, OUTPUT);
  pinMode(motor2Pin2, OUTPUT);
  pinMode(enable2Pin, OUTPUT);

  initWiFi();

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", index_html);
  });

  server.on("/forwardA", HTTP_GET, [](AsyncWebServerRequest *request) {
    moveForwardA();
    request->send(200, "text/html", index_html);
  }); 

  server.on("/backwardA", HTTP_GET, [](AsyncWebServerRequest *request) {
    moveBackwardA();
    request->send(200, "text/html", index_html);
  });

  // Route to set GPIO state to LOW (inverted logic for ESP8266)
  server.on("/stopA", HTTP_GET, [](AsyncWebServerRequest *request) {
    stopMotorA();
    request->send(200, "text/html", index_html);
  });
  server.on("/forwardB", HTTP_GET, [](AsyncWebServerRequest *request) {
    moveForwardB();
    request->send(200, "text/html", index_html);
  }); 

  server.on("/backwardB", HTTP_GET, [](AsyncWebServerRequest *request) {
    moveBackwardB();
    request->send(200, "text/html", index_html);
  });

  // Route to set GPIO state to LOW (inverted logic for ESP8266)
  server.on("/stopB", HTTP_GET, [](AsyncWebServerRequest *request) {
    stopMotorB();
    request->send(200, "text/html", index_html);
  });

  server.begin();
}

void loop() {
  
}

5.实物运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1981388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络基础 - 计算机网络和因特网(2)

计算机网络基础 计算机网络和因特网Internet 结构和 ISP分组延时、丢失和吞吐量四种分组延时分组丢失吞吐量 协议层次及其服务模型概念数据单元&#xff08;DU&#xff09;协议栈TCP/IP 协议各层次的协议数据单元IOS/OSI 参考模型 计算机网络和因特网的历史早期计算机网路&…

RTSP系列三:RTP协议介绍

RTSP系列&#xff1a; RTSP系列一&#xff1a;RTSP协议介绍-CSDN博客 RTSP系列二&#xff1a;RTSP协议鉴权-CSDN博客 RTSP系列三&#xff1a;RTP协议介绍-CSDN博客 RTSP系列四&#xff1a;RTSP Server/Client实战项目-CSDN博客 目录 一、基本概念 二、RTP报文格式 三、R…

代码随想录训练营 Day21打卡 二叉树 part08 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

代码随想录训练营 Day21打卡 二叉树 part08 一、 力扣669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 …

密码学基础:搞懂Hash函数SHA1、SHA-2、SHA3(2)

目录 1.引入 2. SHA512-224\256 3.SHA-3 4.MD5 5.SM3 1.引入 上篇密码学基础&#xff1a;搞懂Hash函数SHA1、SHA-2、SHA3(1)-CSDN博客&#xff0c;我们先就将基础的SHA1\2讲解了&#xff0c;接下来我们继续聊SHA-3、SHA2变体SHA512_224\256等 2. SHA512-224\256 SHA512…

[oeasy]python0028_女性程序员_Eniac_girls_bug_Grace

028_第一个bug是谁发现的_编译之母 回忆上次内容 py文件 是 按照顺序 一行行 挨排 解释执行的 可以用 pdb3 hello.py 来调试程序 顺序执行 程序 在文本中 从上到下 是 一行行写的 解释器 从上到下 是 一行行解释的 调试 也是 从上到下 一行行 调试的 bug这个东西 是什么时候才有…

Rsync未授权访问漏洞

Rsync未授权访问漏洞 Rsync是Liux/Unix下的一个远程数据同步工具&#xff0c;可通过LAN/WAN快速同步多台主机间的文件和目录&#xff0c;默认运行在873端口。由于配置不当&#xff0c;导致任何人可未授权访问Syc,上传本地文件&#xff0c;下载服务器文件。RSyc默认允许匿名访问…

Java—继承和多态 (๑╹◡╹)ノ“““

目录&#xff1a; 一、继承&#xff1a; 为什么面向对象中有继承的概念&#xff1f;那么继承又是什么&#xff0c;继承又有什么作用呢&#xff1f;在我们生活中啊&#xff0c;也存在继承的关系&#xff0c;比如&#xff1a;你父母的财产由你“继承”。那在面向对象中&#xff…

vxe-pulldown 设置了宽度,并不能100%的占满整个容器的解决

1、下拉容器的使用 2、然而&#xff0c;这个宽度的显示是个问题&#xff0c;只占了一小部分&#xff1a; 长度并没有充满整个容器。 vxe-input设置了100%&#xff0c;然后也是一样的效果。 3、解决&#xff1a; .vxe-pulldown {width: 100% !important;} 增加上面的样式&…

本地GitLab runner自动编译Airoha项目

0 Preface/Foreword 1 GitLab runner环境 具体情况如下&#xff1a; Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户&#xff0c;名为gitlab-runner 2 自动编译 2.1 Permission denied 编译过程中&#xff0c;有两个文件出现权限不允…

Java语言程序设计基础篇_编程练习题*16.4 (创建一个英里/公里的转换器)

目录 *16.4 (创建一个英里/公里的转换器) 代码示例 结果展示 *16.4 (创建一个英里/公里的转换器) 编写一个程序来转换英里和公里&#xff0c;如图16-37b所示。如果在英里文本域Mile中输入一个值之后按下回车键&#xff0c;就会在公里文本域公里值。同样的&#xff0c;在公里文…

Latex入门指南:从下载到安装的全面教程

本篇博客旨在为初学者提供一个全面的Latex入门指南&#xff0c;涵盖了从下载、安装到配置Texlive和TexStudio的详细步骤。通过本指南&#xff0c;您将了解到如何正确安装Latex环境并成功运行第一个Latex文档&#xff0c;为撰写高质量的科技论文或书籍打下坚实基础。 目录 一定…

因为不懂ESLint,我被公司开除了……

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

把握现货黄金价格走势与买入时机 这两点缺一不可

在现货黄金投资中&#xff0c;对黄金价格走势的分析和做交易&#xff08;买入卖出&#xff09;&#xff0c;这些动作之间是相关联的&#xff0c;而且联系很大&#xff0c;比方说投资者如果没有对现货黄金价格走势做正确有效的分析&#xff0c;那他可能在一些交易中获得盈利&…

【附PDF】《大模型应用开发 动手做 AI Agent》,第一本给程序员看的AI Agent图书!

AI Agent火爆到什么程度&#xff1f; OpenAI创始人奥特曼预测&#xff0c;未来各行各业&#xff0c;每一个人都可以拥有一个AI Agent&#xff1b;比尔盖茨在2023年层预言&#xff1a;AI Agent将彻底改变人机交互方式&#xff0c;并颠覆整个软件行业&#xff1b;吴恩达教授在AI …

隧道通风网络节点图导出CAD文本时的三角形算法

在TESP软件中涉及到将带文本的节点图导出为CAD文件&#xff0c;其中文本的绘制需要根据Section的方向来确定&#xff0c;确保和绘图的习惯一致。具体包括&#xff1a; &#xff08;1&#xff09;垂直绘制的Section需确保文字字头向左。 &#xff08;2&#xff09;除了垂直的文…

Golang面试题三(map)

1.map底层实现 由图看出&#xff0c;其实map的底层结构体是hmap&#xff0c;同时hmap里面维护着若干个bucket数组&#xff08;即桶数组&#xff09;。bucket数组中每个元素都是bmap结构的&#xff0c;bmap中存储着8个key-value的键值对&#xff0c;如果是满了的话&#xff0c;当…

奥运会Ⅵ--LLM 是否狡猾到可以自行欺骗你?

这已经成为一句老生常谈&#xff0c;因为它是事实&#xff1a;人类开发的任何工具都可以用于行善或作恶。你可以用锤子敲钉子或砸某人的头。你可以用火取暖或烧毁房屋。等等。 因此&#xff0c;数字世界的最新工具既带来好处&#xff0c;也带来风险&#xff0c;这不足为奇。其…

文献解读-遗传病-第二十六期|《癫痫的临床特征、诊疗和KCNH5突变》

关键词&#xff1a;遗传病&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Clinical Feature, Treatment, and KCNH5 Mutations in Epilepsy标题&#xff08;中文&#xff09;&#xff1a;癫痫的临床特征、诊疗和…

文心一言 VS 讯飞星火 VS chatgpt (318)-- 算法导论22.3 10题

十、修改深度优先搜索的伪代码&#xff0c;让其打印出有向图G的每条边及其分类。并指出&#xff0c;如果图G是无向图&#xff0c;要进行何种修改才能达到相同的效果。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;我们来定义深度优先搜索&…

leetcode:汇总区间

题目&#xff1a; 给定一个无重复元素的有序整数数组nums。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说&#xff0c;nums的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于nums的数字X。列表中的每个区间范围[a,b]应该按…