ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车
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无线远程监控+四驱动小破车的更多相关文章
- Java虚拟机二:使用jvisualvm工具远程监控tomcat内存
jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的java进程的内存占用,线程状态等信息. 一.配置tomcat 在 ...
- [原创]Java应用性能远程监控系统(C/S架构)
Java应用性能远程监控系统(使用C/S架构) 适用于监控所有Java应用,具有堆内存监控.方法区监控.GC监控.类加载监控.类编译监控与线程监控,提供堆快照下载,线程快照下载.体验网址:http:/ ...
- 【安富莱专题教程第3期】开发板搭建Web服务器,利用花生壳让电脑和手机可以外网远程监控
说明:1. 开发板Web服务器的设计可以看我们之前发布的史诗级网络教程:链接.2. 需要复杂些的Web设计模板,可以使用我们V6开发板发布的综合Demo:链接.3. 教程中使用的是花生壳免费版, ...
- jvisualvm 连接 jstatd 远程监控 jvm 或 Visual GC提示"不受此JVM支持“
Visual GC提示"不受此JVM支持",可以使用此方法解决. 一.添加配置文件 jstatd.all.policy [root@localhost /]# cd /usr/lo ...
- DIY远程监控室内温度设备(tiny6410+ds18b20+yeelink+curl)
春节了,趁着假期的空闲时间,抽空捣鼓了下tiny6410开发板,发现这个东东尘封许久,很长时间没用过了.貌似最近物联网大热,谷歌收购Nest,其设计的恒温器能够智能调节和远程控制房间的温度,UI和设计 ...
- 转载:JProfiler远程监控LINUX上的Tomcat过程细讲
来源于xuwanbest的博客 所谓"工欲善其事,必先利其器",好的工具确能起到事半工倍的作用.我用到的最多的就两个JConsole 和JProfiler .JConsole监 ...
- SNMP远程监控进程信息的OID
最近有个项目需要用snmp远程监控进程信息.于是我查了一下资料. 一.资料 .1.3.6.1.2.1.25.4.2.1.1.iso.org.dod.internet.mgmt.mib-2.host.h ...
- c# 远程监控(4) 接收端 RTP包重组 分屏显示
我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上.最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示.完成远程监控的模拟. 先来个效 ...
- c# 远程监控(1) 大纲
此篇文章主要讲了如何使用C# Winform程序模拟一个远程监控系统,并使用RTP实时传输协议传输数据. 应用场景:远程监控.局域网视频会议.客户端流式缓冲播放 这方面的资料还是有一些,但是都需要整合 ...
- 远程监控 – 应用程序运行状况测量 CSF 博客
在远程监控基础知识和故障排除中,我们探讨了 Windows Azure 平台提供的基础指标.信息源.工具和脚本,介绍了有关监控和应用程序运行状况的基本原则.我们演示了如何利用这些基本原则对在 Wind ...
随机推荐
- java关于数组的复制,反转、查找
一.数组的赋值: arr2=arr1;对于该赋值而言,地址值一样,所以arr1会随着arr2的变化而变化.这不能称作数组的复制,因为只是把地址赋过去了.地址一样,指向的是堆空间中唯一的数组实体(数值) ...
- 11. 基于ARM Cortex-A9中断详解
一.中断概念 操作系统中,中断是很重要的组成部分.出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行. 有了中断系统才可以不用一直 ...
- 超越Perplexity的AI搜索引擎框架MindSearch
超越Perplexity的AI搜索引擎框架MindSearch 介绍 MindSearch 是InternLM团队的一个开源的 AI 搜索引擎框架,由中科大和上海人工智能实验室联合打造的,具有与 Pe ...
- .NET 9 优化,抢先体验 C# 13 新特性
前言 微软即将在 2024年11月12日发布 .NET 9 的最终版本,而08月09日发布的.NET 9 Preview 7 是最终发布前的最后一个预览版.这个版本将与.NET Conf 2024一同 ...
- C#反射在数据库操作中的应用(反射属性,反射字段)
这几天学习反射的应用,今天把其应用到数据操作中 现记录学习笔记 环境为: 编译器:vs2017 数据库:access 反射类型为:字段 1先在类文件的定义是用哪种数据库,和用字段还是属性来反射 本例是 ...
- centos7.3离线安装和配置NFS
概述 # NFS为 Network FileSystem 的简称,它的目的就是想让不同的机器.不同的操作系统可以彼此分享个别的档案啦! 目前在 Unix Like 当中用来做为文件服务器是相当不错的一 ...
- 异源数据同步 → DataX 为什么要支持 kafka?
开心一刻 昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我 10 万,要我陪她去上海,我没同意 朋友评论道:你没同意,为什么在上海? 我回复到:上个月没同 ...
- Mac 上几款 Telegram App 的区别
Mac App Store 上有 Telegram 和 Telegram Lite 两款应用,而 Homebrew 上有 telegram 和 telegram-desktop 两款应用.下面介绍一下 ...
- Windos操作系统下的Zookeeper安装图文教程
凯哥已经准备好最新版本3.9.1且已经配置好了.既获取到配置好的. 获取到凯哥准备的安装后,只需要修改一下配置.将解压包解压后,找到conf文件,里面有个zoo.cfg配置文件.如下图: 下载后con ...
- PicGo RequestError: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:36677
PicGo RequestError: Error: tunneling socket could not be established, cause=connect ECONNREFUSED 127 ...