基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目

写在前面:

不知道大家有没有经历过,在茫茫车海中找不到自己山地车情况,针对这个痛点(开玩笑的),我做了个小玩意,纯属娱乐,拿出来,在疫情逐渐加剧的时候,给大家带来一份欢乐。

B站有项目的概要视频,不喜欢文字的同学可以去看看,看完别忘了点赞哦!

B站视频地址

项目所有软件与硬件支持都在我的码云仓库里。

码云仓库

下面就是这个项目的简单介绍了。

硬件支持:

电路元件

ESP8266模块、BY8301语音控制芯片、flash芯片、功放芯片、扬声器、电容、电阻、二极管、LED。

原理图

原理部分比较简单,就是连一连控制的IO引脚,别的好像也没什么要注意的。

PCB

大家想复现的时候,我建议把电阻、电容的封装换成最大号的,我第一次没经验,瞎弄,焊接的时候可是废了老鼻子劲了。

真的是吃一堑长一智。

打样

嘉立创,免费打样,一个月一个用户有两次机会。

要求10cm×10cm以内,二层板,四层板,都可以,颜色可任选,我选了黑色(因为酷),因此我等了差不多有两周时间(绿色的最快),还碰到嘉立创服务器崩溃,维护了两天。

焊接完成

看着还可以,但这已经不知道是焊接的第几个板子了,中间焊不好,老是把焊盘给带下来,最后直接用0欧姆的电阻当飞线给连起来了,再次重申:在空间允许的情况下,一定要选大封装,要分散开布置,我的血泪教训!!

接下来就是软件部分了。

软件支持:

开发平台

Arduino平台,大量的集成库,贼方便~

逻辑控制部分代码

代码分为两部分,一部分烧录直接烧录到ESP8266,用来构建个网络服务器端。


#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // 本程序使用ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // 本程序使用ESP8266WebServer库
#include <FS.h> // 本程序使用SPIFFS库 ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti' ESP8266WebServer esp8266_server(80); // 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80) int button1Pin = D1;
int button2Pin = D2;
int button3Pin = D3;
int button4Pin = D4;
int button5Pin = D5;
int button6Pin = D6; void setup(){
Serial.begin(9600);
Serial.println(""); pinMode(LED_BUILTIN, OUTPUT); // 初始化NodeMCU控制板载LED引脚为OUTPUT
pinMode(button1Pin, OUTPUT);
pinMode(button2Pin, OUTPUT);
pinMode(button3Pin, OUTPUT);
pinMode(button4Pin, OUTPUT);
pinMode(button5Pin, OUTPUT);
pinMode(button6Pin, OUTPUT); digitalWrite(button1Pin,HIGH);
digitalWrite(button2Pin,HIGH);
digitalWrite(button3Pin,HIGH);
digitalWrite(button4Pin,HIGH);
digitalWrite(button5Pin,HIGH);
digitalWrite(button6Pin,HIGH); //通过addAp函数存储 WiFi名称 WiFi密码
wifiMulti.addAP("iron2222", "184******009"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。 int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 在当前环境中搜索addAP函数所存储的WiFi
delay(1000); // 如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print('.'); // 将会连接信号最强的那一个WiFi信号。
} // WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址 if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
} esp8266_server.on("/1-Control", handle1Control); // 告知系统如何处理/1-Control请求
esp8266_server.on("/2-Control", handle2Control);
esp8266_server.on("/3-Control", handle3Control);
esp8266_server.on("/4-Control", handle4Control);
esp8266_server.on("/5-Control", handle5Control);
esp8266_server.on("/6-Control", handle6Control); esp8266_server.onNotFound(handleUserRequest); // 告知系统如何处理其它用户请求 esp8266_server.begin(); // 启动网站服务
Serial.println("HTTP server started");
} void loop(){
esp8266_server.handleClient(); //处理用户请求
digitalWrite(LED_BUILTIN,HIGH);
} // 处理/1-Control请求
void handle1Control(){
digitalWrite(button1Pin,!digitalRead(button1Pin));
delay(500);
digitalWrite(button1Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
}
void handle2Control(){
digitalWrite(button2Pin,!digitalRead(button2Pin));
delay(500);
digitalWrite(button2Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
}
void handle3Control(){
digitalWrite(button3Pin,!digitalRead(button3Pin));
delay(500);
digitalWrite(button3Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
}
void handle4Control(){
digitalWrite(button4Pin,!digitalRead(button4Pin));
delay(500);
digitalWrite(button4Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
}
void handle5Control(){
digitalWrite(button5Pin,!digitalRead(button5Pin));
delay(500);
digitalWrite(button5Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
}
void handle6Control(){
digitalWrite(button6Pin,!digitalRead(button6Pin));
delay(500);
digitalWrite(button6Pin,HIGH); esp8266_server.sendHeader("Location", "/yuyinctrl.html");
esp8266_server.send(303);
} // 处理用户浏览器的HTTP访问
void handleUserRequest() { // 获取用户请求资源(Request Resource)
String reqResource = esp8266_server.uri();
Serial.print("reqResource: ");
Serial.println(reqResource); // 通过handleFileRead函数处处理用户请求资源
bool fileReadOK = handleFileRead(reqResource); // 如果在SPIFFS无法找到用户访问的资源,则回复404 (Not Found)
if (!fileReadOK){
esp8266_server.send(404, "text/plain", "404 Not Found");
}
} bool handleFileRead(String resource) { //处理浏览器HTTP访问 if (resource.endsWith("/")) { // 如果访问地址以"/"为结尾
resource = "/index.html"; // 则将访问地址修改为/index.html便于SPIFFS访问
} String contentType = getContentType(resource); // 获取文件类型 if (SPIFFS.exists(resource)) { // 如果访问的文件可以在SPIFFS中找到
File file = SPIFFS.open(resource, "r"); // 则尝试打开该文件
esp8266_server.streamFile(file, contentType);// 并且将该文件返回给浏览器
file.close(); // 并且关闭文件
return true; // 返回true
}
return false; // 如果文件未找到,则返回false
} // 获取文件类型
String getContentType(String filename){
if(filename.endsWith(".htm")) return "text/html";
else if(filename.endsWith(".html")) return "text/html";
else if(filename.endsWith(".css")) return "text/css";
else if(filename.endsWith(".js")) return "application/javascript";
else if(filename.endsWith(".png")) return "image/png";
else if(filename.endsWith(".gif")) return "image/gif";
else if(filename.endsWith(".jpg")) return "image/jpeg";
else if(filename.endsWith(".ico")) return "image/x-icon";
else if(filename.endsWith(".xml")) return "text/xml";
else if(filename.endsWith(".pdf")) return "application/x-pdf";
else if(filename.endsWith(".zip")) return "application/x-zip";
else if(filename.endsWith(".gz")) return "application/x-gzip";
return "text/plain";
}

网页构建代码

主页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>语音模块控制</title>
</head>
<body>
<center>
<a href="https://gitee.com/iron2222/esp8266" target="_blank"><img src="/img/lalala.png" alt="iron2222"></a>
<h1>欢迎来到我的小家!</h1>
<p><a href="yuyinctrl.html">前往语音控制页面</a></p>
<p>此页面用于演示如何通过网页按钮来控制语音播放。</p>
<p>详情请参考我的码云仓库: <a href="https://gitee.com/iron2222/esp8266" target="_blank">https://gitee.com/iron2222/esp8266</a>
</center>
</body> </html>

语音控制页面

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>语音模块控制</title>
</head>
<body>
<center>
<h1>语音模块选择</h1>
<p>通过以下按键,您可以选择所需要播放的语音</p>
<form action="1-Control"><input type="submit" value="语音1"style="width:100px;height:60px">
</form>
<br>
<form action="2-Control"><input type="submit" value="语音2"style="width:100px;height:60px">
</form>
<br>
<form action="3-Control"><input type="submit" value="语音3"style="width:100px;height:60px">
</form>
<br>
<form action="4-Control"><input type="submit" value="语音4"style="width:100px;height:60px">
</form>
<br>
<form action="5-Control"><input type="submit" value="语音5"style="width:100px;height:60px">
</form>
<br>
<form action="6-Control"><input type="submit" value="语音6"style="width:100px;height:60px">
</form>
<br>
<form action="index.html"><input type="submit" value="返回首页"style="width:100px;height:60px">
</form>
<p>此页面用于演示如何通过网页按钮来控制语音播放。</p>
<p>详情请参考我的码云网址: <a href="https://gitee.com/iron2222/esp8266" target="_blank">https://gitee.com/iron2222/esp8266</a>
</center>
</body> </html>

网页效果展示


网页文件和图片资源是与要通过,ardunio直接上传到你的ESP8266这个板子里面的。具体方式大家可以参考太极创客网站,里面的教程说的相当清楚。附上地址吧:

太极创客

以上便是软件的所有内容。

实际效果演示:

演示效果大家可以去看我那个视频,因为使用的是wifi连接,所以不建议室内,室外50~100m还是可以连接上的,但可能你得换一个功率相当大的喇叭,才能听得到你的山地车的回应。

总结

第一次从头到尾做一个小东西,收获很多,教训也很多,加油~

祝大家早安,午安和晚安!!!

基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目的更多相关文章

  1. Diy智能家居-1.基于esp8266的语音控制系统(开篇)

    目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...

  2. Arduino 基于 ESP8266 配置WIFI模块

    Arduino 基于 ESP8266 配置WIFI模块 使用ESP8266作为服务器,使用浏览器访问该服务器,从而控制LED灯 选择 [文件]->[示例]->[ESP8266WIFI]-& ...

  3. 智能家居-3.基于esp8266的语音控制系统(软件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  4. 智能家居-2.基于esp8266的语音控制系统(硬件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  5. 智能家居-1.基于esp8266的语音控制系统(开篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...

  6. Obloq模块:基于ESP8266的物联网模块

    OBLOQ 物联网模块 OBLOQ模块是DFRobot公司开发的一款基于ESP8266芯片的物联网通信模块.模块使用串口(TTL UART)和Arduino(或者其他单片机)通信,支持MQTT,HTT ...

  7. Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目

    作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...

  8. 基于云原生DevOps服务自动化部署前端项目学习总结

    本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...

  9. 物联网 开发板 基于ESP8266

    The ESP8266 The ESP8266 is a highly integrated chip designed for the needs of an increasingly connec ...

随机推荐

  1. ApacheCN PHP 译文集 20211101 更新

    PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...

  2. [SDOI2017]数字表格 & [MtOI2019]幽灵乐团

    P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...

  3. Atcoder ARC-064

    ARC064(2020.7.23) A 直接贪心即可. B 手玩样例可以猜出这样一个结论,如果两端字符相同,如果字符串长度为奇数那么后手赢,否则先手赢,两端字符不同则相反.证明的话先从特殊情况开始入手 ...

  4. PHP获取日期和时间:

    转载请注明来源:https://www.cnblogs.com/hookjc/ 使用函式 date() 实现 <?php echo $showtime=date("Y-m-d H:i: ...

  5. 为CentOS 6、7升级gcc至4.8、4.9、5.2、6.3、7.3等高版本

    CentOS 7虽然已经出了很多年了,但依然会有很多人选择安装CentOS 6,CentOS 6有些依赖包和软件都比较老旧,如今天的主角gcc编译器,CentOS 6的gcc版本为4.4,CentOS ...

  6. Linux Makefile 生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明

    1. 为什么要使用后缀名为 .d 的依赖文件? 在 Makefile 中, 我们的依赖关系可能需要包含一系列的头文件.比如main.c 源文件内容如下: #include "stdio.h& ...

  7. JVM学习十 -(复习)内存分配与回收策略

    内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...

  8. 网络层主要协议与arp欺骗

    网络层主要协议与arp欺骗 目录 网络层主要协议与arp欺骗 一.网络层(Network Layer) 1.网络层的功能 2.IP数据报(IP Datagram) 二.网络层的主要协议 1.ICMP协 ...

  9. 人工智能——CNN卷积神经网络项目之猫狗分类

    首先先导入所需要的库 import sys from matplotlib import pyplot from tensorflow.keras.utils import to_categorica ...

  10. etcdserver: mvcc: database space exceeded

    文章目录 查看节点状态 获取旧版本号 压缩旧版本 清理碎片 再次查看节点状态 清楚告警 k8s的apiserver组件重启失败,通过journalctl -xeu kube-apiserver命令查看 ...