ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车

小车源代码

注意修改WIFI 信息

#include <analogWrite.h>
#include <WiFi.h>
#include <PubSubClient.h> #define led_one 18
// L298N Info GPIO
short m1_ena = 32;
short m1_in1 = 33;
short m1_in2 = 25; short m2_enb = 26;
short m2_in3 = 27;
short m2_in4 = 14; short m3_ena = 12;
short m3_in1 = 13;
short m3_in2 = 23; short m4_enb = 22;
short m4_in3 = 21;
short m4_in4 = 19; int car_state = 0; // 小车状态
int car_speed = 150; // 小车电机脉冲,
void car_init(); // 小车初始化
void car_stop(); // 小车停
void car_mqtt_control(); // 小车控制函数
void car_m1_go();
void car_m2_go();
void car_m3_go();
void car_m4_go();
void car_m1_back();
void car_m2_back();
void car_m3_back();
void car_m4_back();
void car_m1_stop();
void car_m2_stop();
void car_m3_stop();
void car_m4_stop(); void car_top_go(); // 全速前进 ↑
void car_back_back(); // 全速后退 ↓
void car_left(); // 左←
void car_right(); // 右→
void car_back_left(); // 左斜下
void car_back_right(); // 右斜下
void car_top_left(); // 左斜上
void car_top_right(); // 右斜上
void car_360(); // WIFI info 这是你家的wifi信息 SSID 网络频带在2.4 GHz 注意!!!
const char *SSID = "4G-UFI-AB87";
const char *PASSWORD = "1234567890"; // MQTT Info
// http://www.taichi-maker.com/public-mqtt-broker/ 免费的MQTT服务器
const char *MQTT_SERVERS = "broker-cn.emqx.io";
int MQTT_PROT = 1883; // MQTT 主题
const char *MQTT_TOPIC_LED = "xapi/car/led";
const char *MQTT_TOPIC_ONLINE = "xapi/car/online";
const char *MQTT_TOPIC_CONTROL = "xapi/car/control";
const char *MQTT_TOPIC_SPEED = "xapi/car/speed";
const char *MQTT_TOPIC_HEART = "xapi/car/heart";
const char *CLIENT_ID = "esp8266-457065e5-f063-474e-2saf-cacf5cb52af5"; WiFiClient espClient;
PubSubClient client(espClient);
void init_wifi(); // 初始化wifi
void mqtt_reconnect(); // 重新连接wifi
void mqtt_msg_callback(char *topic, byte *payload, unsigned int length); // mqtt 消息回调
void mqtt_heart(); // 心跳
void led_topic_fn(String data); // led topic 处理函数
void car_control_fn(String data);// 小车 topic 处理函数
void car_speed_fn(String data); // 速度控制 void setup() {
Serial.begin(115200);
pinMode(led_one, OUTPUT);
car_init(); // 小车初始化
init_wifi(); // wifi 初始化
client.setServer(MQTT_SERVERS, MQTT_PROT); // 设置mqtt 服务和端口
client.setCallback(mqtt_msg_callback); // 设置mqtt 回调函数
} void loop() {
if (!client.connected())
{
mqtt_reconnect();
}
client.loop();
car_mqtt_control();
delay(500);
mqtt_heart();
}
// car -----------------------------------
void car_init(){
pinMode(m1_ena, OUTPUT);
pinMode(m1_in1, OUTPUT);
pinMode(m1_in2, OUTPUT); pinMode(m2_enb, OUTPUT);
pinMode(m2_in3, OUTPUT);
pinMode(m2_in4, OUTPUT); pinMode(m3_ena, OUTPUT);
pinMode(m3_in1, OUTPUT);
pinMode(m3_in2, OUTPUT); pinMode(m4_enb, OUTPUT);
pinMode(m4_in3, OUTPUT);
pinMode(m4_in4, OUTPUT);
} void car_stop(){
digitalWrite(m1_in1, LOW);
digitalWrite(m1_in2, LOW);
digitalWrite(m2_in3, LOW);
digitalWrite(m2_in4, LOW);
digitalWrite(m3_in1, LOW);
digitalWrite(m3_in2, LOW);
digitalWrite(m4_in3, LOW);
digitalWrite(m4_in4, LOW);
} // ------------------------- M1
void car_m1_go(){
analogWrite(m1_ena, car_speed);
digitalWrite(m1_in1, LOW);
digitalWrite(m1_in2, HIGH);
} void car_m1_back(){
analogWrite(m1_ena, car_speed);
digitalWrite(m1_in1, HIGH);
digitalWrite(m1_in2, LOW);
} // ----------------------M2
void car_m2_go(){
analogWrite(m2_enb, car_speed);
digitalWrite(m2_in3, LOW);
digitalWrite(m2_in4, HIGH);
} void car_m2_back(){
analogWrite(m2_enb, car_speed);
digitalWrite(m2_in3, HIGH);
digitalWrite(m2_in4, LOW);
} // ----------------------M3
void car_m3_go(){
analogWrite(m3_ena, car_speed);
digitalWrite(m3_in1, LOW);
digitalWrite(m3_in2, HIGH);
} void car_m3_back(){
analogWrite(m3_ena, car_speed);
digitalWrite(m3_in1, HIGH);
digitalWrite(m3_in2, LOW);
} // -----------------------M4
void car_m4_go(){
analogWrite(m4_enb, car_speed);
digitalWrite(m4_in3, LOW);
digitalWrite(m4_in4, HIGH);
}
void car_m4_back(){
analogWrite(m4_enb, car_speed);
digitalWrite(m4_in3, HIGH);
digitalWrite(m4_in4, LOW);
} void car_m1_stop(){
digitalWrite(m1_in1, LOW);
digitalWrite(m1_in2, LOW);
}
void car_m2_stop(){
digitalWrite(m2_in3, LOW);
digitalWrite(m2_in4, LOW);
};
void car_m3_stop(){
digitalWrite(m3_in1, LOW);
digitalWrite(m3_in2, LOW);
};
void car_m4_stop(){
digitalWrite(m4_in3, LOW);
digitalWrite(m4_in4, LOW);
}; // -----------------------小车组合移动
void car_top_go(){
car_m1_go();
car_m2_go();
car_m3_go();
car_m4_go();
} void car_back_back(){
car_m1_back();
car_m2_back();
car_m3_back();
car_m4_back();
} void car_top_left(){
car_m1_stop();
car_m4_stop(); car_m2_go();
car_m3_go();
} void car_top_right(){
car_m2_stop();
car_m3_stop(); car_m1_go();
car_m4_go();
} void car_back_left(){
car_m1_stop();
car_m4_stop(); car_m2_back();
car_m3_back();
} void car_back_right(){
car_m2_stop();
car_m3_stop(); car_m1_back();
car_m4_back();
} void car_left(){
car_m2_back();
car_m3_back(); car_m1_go();
car_m4_go();
} void car_right(){
car_m2_go();
car_m3_go(); car_m1_back();
car_m4_back();
} void car_360(){
car_m1_go();
car_m3_go(); car_m2_back();
car_m4_back();
} void car_mqtt_control(){
switch (car_state)
{
case 1:
car_top_go();
break;
case 2:
car_back_back();
break;
case 3:
car_left();
break;
case 4:
car_right();
break;
case 5:
car_top_left();
break;
case 6:
car_top_right();
break;
case 7:
car_back_left();
break;
case 8:
car_back_right();
break;
case 9:
car_360();
break;
case 0:
car_stop();
break;
default:
car_stop();
break;
}
} // MQTT --------------------------------------
void led_topic_fn(String data){
Serial.println("led-s");
if (data == "1")
{
Serial.println("open_led");
digitalWrite(led_one, HIGH);
}
else
{
Serial.println("close_led");
digitalWrite(led_one, LOW);
}
} void car_control_fn(String data){
Serial.println("方向-控制");
car_speed = 150;
car_state = data.toInt();
} void car_speed_fn(String data){
Serial.println("方向-速度");
int msgData = data.toInt();
if(msgData >= 255){
car_speed = 255;
return;
}
if(msgData <= 0){
car_speed = 0;
return;
}
car_speed = msgData;
} void init_wifi(){
Serial.println("Connecting to");
Serial.println(SSID); WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
} void mqtt_reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection..."); // 第一步: 创建连接
if (client.connect(CLIENT_ID))
{
Serial.println("connected");
client.publish(MQTT_TOPIC_ONLINE, "cat_online"); // 发布
client.subscribe(MQTT_TOPIC_LED); // 监听 led 主题
client.subscribe(MQTT_TOPIC_CONTROL); // 监听 小车控制
client.subscribe(MQTT_TOPIC_SPEED); // 小车 速度
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
} void mqtt_msg_callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic); // 打印主题信息
Serial.print("] ");
String data = "";
for (unsigned int i = 0; i < length; i++)
{
Serial.print((char)payload[i]); // 打印主题内容
data += String((char)payload[i]);
} String topic_data = String(topic); // String() 异步
// led topic
if (topic_data == MQTT_TOPIC_LED)
{
led_topic_fn(data);
} // car topic
if (topic_data == MQTT_TOPIC_CONTROL)
{
car_control_fn(data);
} // car speed
if(topic_data == MQTT_TOPIC_SPEED ){
car_speed_fn(data);
} Serial.println();
} void mqtt_heart(){
if (client.connected())
{
client.publish(MQTT_TOPIC_HEART, "1");
}
}

ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车的更多相关文章

  1. Java虚拟机二:使用jvisualvm工具远程监控tomcat内存

    jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的java进程的内存占用,线程状态等信息. 一.配置tomcat 在 ...

  2. [原创]Java应用性能远程监控系统(C/S架构)

    Java应用性能远程监控系统(使用C/S架构) 适用于监控所有Java应用,具有堆内存监控.方法区监控.GC监控.类加载监控.类编译监控与线程监控,提供堆快照下载,线程快照下载.体验网址:http:/ ...

  3. 【安富莱专题教程第3期】开发板搭建Web服务器,利用花生壳让电脑和手机可以外网远程监控

    说明:1.  开发板Web服务器的设计可以看我们之前发布的史诗级网络教程:链接.2.  需要复杂些的Web设计模板,可以使用我们V6开发板发布的综合Demo:链接.3.  教程中使用的是花生壳免费版, ...

  4. jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“

    Visual GC提示"不受此JVM支持",可以使用此方法解决. 一.添加配置文件 jstatd.all.policy [root@localhost /]# cd /usr/lo ...

  5. DIY远程监控室内温度设备(tiny6410+ds18b20+yeelink+curl)

    春节了,趁着假期的空闲时间,抽空捣鼓了下tiny6410开发板,发现这个东东尘封许久,很长时间没用过了.貌似最近物联网大热,谷歌收购Nest,其设计的恒温器能够智能调节和远程控制房间的温度,UI和设计 ...

  6. 转载:JProfiler远程监控LINUX上的Tomcat过程细讲

    来源于xuwanbest的博客   所谓"工欲善其事,必先利其器",好的工具确能起到事半工倍的作用.我用到的最多的就两个JConsole 和JProfiler .JConsole监 ...

  7. SNMP远程监控进程信息的OID

    最近有个项目需要用snmp远程监控进程信息.于是我查了一下资料. 一.资料 .1.3.6.1.2.1.25.4.2.1.1.iso.org.dod.internet.mgmt.mib-2.host.h ...

  8. c# 远程监控(4) 接收端 RTP包重组 分屏显示

    我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上.最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示.完成远程监控的模拟. 先来个效 ...

  9. c# 远程监控(1) 大纲

    此篇文章主要讲了如何使用C# Winform程序模拟一个远程监控系统,并使用RTP实时传输协议传输数据. 应用场景:远程监控.局域网视频会议.客户端流式缓冲播放 这方面的资料还是有一些,但是都需要整合 ...

  10. 远程监控 – 应用程序运行状况测量 CSF 博客

    在远程监控基础知识和故障排除中,我们探讨了 Windows Azure 平台提供的基础指标.信息源.工具和脚本,介绍了有关监控和应用程序运行状况的基本原则.我们演示了如何利用这些基本原则对在 Wind ...

随机推荐

  1. Apache SeaTunnel 2.3.3 版本发布,CDC 支持 Schema Evolution!

    时隔两个月, Apache SeaTunnel 终于迎来大版本更新.此次发布的 2.3.3 版本在功能和性能上均有较大优化改进,其中大家期待已久的 CDC Schema evolution(DDL 变 ...

  2. flex布局被内容被撑开及flex布局下定宽元素被压缩

    实现效果使用flex进行左右布局,左边定宽200px,右边自适应,当右边内容过多,造成右边盒子被撑开,会造成两种问题 左边定宽盒子被压缩解决办法: flex-grow:0;//是否自动增长空间 fle ...

  3. 前端黑科技:使用 JavaScript 实现网页扫码功能

    在数字化时代,二维码已经渗透到我们生活的方方面面.从移动支付到产品溯源,二维码凭借其便捷性和高效性,成为了信息传递的重要载体.而随着前端技术的不断发展,我们甚至可以使用 JavaScript 在网页端 ...

  4. 全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性

    全网最适合入门的面向对象编程教程:35 Python 的内置数据类型-文档字符串和__doc__属性 摘要: 在 Python 中,文档字符串(Docstring)是一种用于为模块.类.方法或函数编写 ...

  5. wpf 如何7步写一个badge控件

    首先看一下效果: 任意控件可以附加一个文字在控件的右上角,并带有红色背景 第一步,新建一个空的wpf项目: 第二步,创建一个类,取名为badge: 第三步,将badge的父类设置成  System.W ...

  6. 远程采集服务器指标信息(二)通过telnet执行远程命令

    远程采集服务器信息,比如说磁盘信息.内存信息. 现介绍java通过telnet执行命令采集服务器信息,比如说执行df.ls.top. 这里在linux环境通过root或者其他用户登录执行解析方式有点出 ...

  7. get方法传参后端接收数据异常 - 特殊字符需转义

    get方法传参的时候,如果有特殊字符,如 + 等,无法被识别,导致后端处理异常,所以,get方式,如果有特殊字符,需要转义后再请求接口 1.java 特殊字符转义 URLEncoder.encode( ...

  8. GitHub Copilot 典型使用场景实践

    大家好,我是Edison. 近期我们一直在使用GitHub Copilot协助开发编码工作,总结了一些实际场景的用法,可能在目前网络中很多的博客中都没有提及到,本文一一分享给你. 简介:你的结对编程伙 ...

  9. 用CSS border画一个铅笔

    先上效果图 该例子来自 CSS世界 的书中项目 总结技巧如下: 巧用 border 和 伪元素 来 绘制层叠效果. 使用 transform-origin 来改变元素的轴心 使用 filter:dro ...

  10. ASP.NET Core – DateTime, DateTimeOffset, DateOnly, TimeOnly, TimeSpan, TimeZone, NodaTime 使用基础

    前言 心血来潮,这篇讲点基础的东西. 对日期和时区 timezone 不熟悉的读者,请先看这篇 Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年 ...