基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目
基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目
写在前面:
不知道大家有没有经历过,在茫茫车海中找不到自己山地车情况,针对这个痛点(开玩笑的),我做了个小玩意,纯属娱乐,拿出来,在疫情逐渐加剧的时候,给大家带来一份欢乐。
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语音模块的与山地车捉迷藏的小项目的更多相关文章
- Diy智能家居-1.基于esp8266的语音控制系统(开篇)
目录Diy智能家居-1.基于esp8266的语音控制系统(开篇) https://blog.csdn.net/arno1988/article/details/82628589 Diy智能家居-2.基 ...
- Arduino 基于 ESP8266 配置WIFI模块
Arduino 基于 ESP8266 配置WIFI模块 使用ESP8266作为服务器,使用浏览器访问该服务器,从而控制LED灯 选择 [文件]->[示例]->[ESP8266WIFI]-& ...
- 智能家居-3.基于esp8266的语音控制系统(软件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- 智能家居-2.基于esp8266的语音控制系统(硬件篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...
- 智能家居-1.基于esp8266的语音控制系统(开篇)
智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) apache-apollo安 ...
- Obloq模块:基于ESP8266的物联网模块
OBLOQ 物联网模块 OBLOQ模块是DFRobot公司开发的一款基于ESP8266芯片的物联网通信模块.模块使用串口(TTL UART)和Arduino(或者其他单片机)通信,支持MQTT,HTT ...
- Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目
作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...
- 基于云原生DevOps服务自动化部署前端项目学习总结
本文主要以部署前端Vue项目为例,讲述了如何基于云原生DevOps服务自动化部署前端项目~从开发完成到线上环境,我们只需提交代码即可~ 一.引言 作为一名开发人员,日常工作中我们除了需要负责代码的开发 ...
- 物联网 开发板 基于ESP8266
The ESP8266 The ESP8266 is a highly integrated chip designed for the needs of an increasingly connec ...
随机推荐
- 计算机网络-5-9-TCP拥塞控制
TCP拥塞控制 拥塞控制的一般原理 在计算机网络中的链路容量(带宽),交换节点中的缓存和处理机等,都是网络的资源,在某段时间,若对网络中某一资源的需求超过该资源所能提供的可用部分,网络性能就会变坏,这 ...
- JOISC 2017
Day1 「JOISC 2017 Day 1」开荒者 首先观察部分分发现分档很多,于是考虑一步步思考上来. 首先有一点关键观察(一): 风吹的顺序是无所谓的,令分别往东.西.南.北吹了 \(r, l, ...
- IntelliJ IDEA 学习笔记 - 修改编码
感谢原文作者:codeke 原文链接:https://blog.csdn.net/cgl125167016/article/details/78666432 仓库:https://github.com ...
- js静态成员和实例成员
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ext原码学习之lang-Object.js
// JavaScript Document (function(){ var TemplateClass = function(){}, ExtObject = Ext.Object = { cha ...
- 《Effective Python》笔记——第1章 用Pythonic方式来思考
一. 遵循PEP8风格指南. PEP8是对python代码格式而编订的风格指南.地址:https://www.python.org/dev/peps/pep-0008/ 个人觉得不一定完全按照PEP8 ...
- Git重命名远程分支
一.重命名本地分支 将hot_fix分支重命名为bug_fix git branch -m hot_fix bug_fix 二.推送重命名后的本地分支到远程仓库 git push origin bug ...
- MySql索引分析及查询优化
B-Tree 核心特点: 多路,非二叉树 每个节点既保存索引,又保存数据 搜索时相当于二分查找 B+Tree 核心特点 多路非二叉 只有叶子节点保存数据 搜索时相当于二分查找 增加了相邻接点的指向指针 ...
- 阅读mybatis的源码的思路
■ 阅读源码mybatis操作数据库的过程: /* 测试查询 */ @Test public void testGet() throws IOException { // 1.从classpath路径 ...
- 面试官:谈谈你对IO流和NIO的理解
一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...