一.项目描述
FireBeetle ESP32-E深度支持ArduinoIDE,还可以使用MicroPython、Mind+图形化等编程环境来操控板载硬件资源。DFRobot公司提供上千种免焊接的Gravity接口传感器与执行器。
特性:
· 拥有更丰富的软硬件资源
· 体积小巧,仅25.4 × 60 mm
· ESP32双核低功耗主控,WiFi+BT4.0二合一
· GDI显示接口,可以单线连接显示屏
· 板载充电电路以及PH2.0锂电池接口
引脚排列:
FireBeetle ESP32-E 最多有 22 个物理 GPIO,其中 34-39 号管脚仅作为输入管脚,其他的可以作为输入和输出管脚。所有逻辑电压均为 3.3V。
二.设计思路
因为以前做过类似的遥控小车的小玩具,所以当时看到有这个题目便很快决定做这个题目,在一起买的模块里我买了屏幕和一个手势感应,但是我选择使用手机遥控后,手势感应貌似就用不上了,原本是想用其感应手势控制小车的。
(1)硬件部分
当然,主控采用的是本次活动的核心FireBeetle 2 ESP32-E IoT。
驱动方面,采用了很便宜很实惠的L298N驱动,其驱动方法是使用两个io控制方向,一个pwm输出控制转速,并且使用5v以上电源时,还能输出一个5v供电给单片机(虽然是被淘汰的东西,但是便宜啊!)。
车模方面采用淘宝爆款双电机三轮车。
显示屏采用DFR0847,用自带的排线很方便。
供电方面,使用两节18650串联7.4v供电,没有多余的降压电路。
(2)软件部分
软件部分分为两个部分,第一个是Android studio上关于app开发的部分,第二个是关于单片机的部分。
1.首先配置AS的环境,使用java编程语言,导入MQTT的jar包,再导入提前收集好的素材,同时在AndroidManifest.xml文件下开发网络权限。在activity_main.xml中进行操作界面设计,因为功能不多,仅设计了六个按键,控制方向,控制PWM的增加与减少。在MainActivity.java中进行连接服务器与功能的相关配置。
2.使用Arduino进行单片机开发,因为使用esp32,所以以前的一些可以直接套用,安装好相应的库之后就可以直接进行开发,直接驱动屏幕,连接wifi与mqtt服务器。
主要实现:连接MQTT服务器,屏幕控制,对pwm和输出数字电平引脚的控制。
三.部分代码讲解
(1)安卓部分
图层部分,部分界面代码
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="70dp">
<ImageView
android:layout_height="80dp"
android:layout_width="match_parent"
android:id="@+id/image_left"
android:layout_weight="1"
android:src="@drawable/left">
</ImageView>
<ImageView
android:layout_height="80dp"
android:layout_width="match_parent"
android:id="@+id/image_mid"
android:layout_weight="1"
android:src="@drawable/mid">
</ImageView>
<ImageView
android:layout_height="80dp"
android:layout_width="match_parent"
android:id="@+id/image_right"
android:layout_weight="1"
android:src="@drawable/right">
</ImageView>
</LinearLayout>
MQTT服务器配置部分
private String host = "tcp://api.easylink.io:1883";
private String userName = "android";
private String passWord = "";
private String mqtt_id = "386426616";
private String mqtt_sub_topic = "386426616";
private String mqtt_pub_topic = "386426616_ESP";
功能设置部分
image_up =findViewById(R.id.image_up);
image_up.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
publishmessageplus(mqtt_pub_topic,"{\"set\":1}");
}
});
(2)Arduino部分
这里是信息接受判断代码
void callback(char* topic, byte* payload, unsigned int length) {
String msg="";
String str = "";
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
msg+= (char)payload[i];
}
Serial.println(msg);
//////////////////////下面进行自定义开关
if(msg.indexOf("led")) //判断是否是要设置LED灯
{
//取出LED_set数据 并执行
str = msg.substring(msg.indexOf("set\":")+5,msg.indexOf("}"));
if(str.toInt()==1)
{
goAhead();
}
else if(str.toInt()==2)
{
goLeft();
}
else if(str.toInt()==3)
{
goRight();
}
else if(str.toInt()==4)
{
goBack();
}
else if(str.toInt()==5)
{
if(speedCar>50)
speedCar-=50;
}
else if(str.toInt()==6)
{
if(speedCar<1000)
speedCar+=50;
}
else if(str.toInt()==7)
{
stop();
}
}
}
主循环函数
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
String json = "{\"speedCar\":"+String(speedCar)+"}";
client.publish(Mqtt_pub_topic,json.c_str());
}
}
更详细的见代码文件
四.总结
本次funpack最大的收获应该是驱动自己去学习手机app的开发制作,算是弥补了电赛的遗憾。每次项目不能总是重复过去的东西,总要学习一些新知识,于是我便借此次funpack学习了简单的物联网手机app制作,课程来自学习平台bilibili,感谢大佬们的指点。
很感谢硬禾学堂,提供一个平台,能够在空余时间提高自己开发的能力,学习到了更多的知识。同时我也期待未来还能够通过电子森林的funpack等活动学习更多的内容。感谢电子森林能够提供这个平台。希望未来电子森林能够有更多好玩有趣的项目。白嫖更多的板子。