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 ...
随机推荐
- 代码随想录Day15
110.平衡二叉树 (优先掌握递归) 给定一个二叉树,判断它是否是 平衡二叉树 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1. 示例 1: 输入:root = [3,9,20,null, ...
- OSI 七层网络模型和 TCP/IP 四层网络模型
OSI 七层网络模型 网络的七层架构从下到上主要分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层 物理层主要定义物理设备标准,它的主要作用是传输比特流,具体做法是在发送端将 1.0 码 ...
- 【牛客刷题】HJ13 句子逆序
题目链接 题目本身不难,但是牛客的输入样例很坑,因此只好使用bufio来进行输入了: package main import ( "bufio" "fmt" & ...
- springboot代码自动生成
在项目开始阶段经常需要自动生成一批代码,如果使用了mybatis则可以使用mybatis plus就可以生成mybatis相关代码.不过经常项目中还有一些mvc代码需要生成,比如说前端代码.相关sql ...
- String究竟能存储多少字符?
能存储多少字符,通过以下步骤来看 首先String的length方法返回是int.所以理论上长度一定不会超过int的最大值. 编译器对字符串字面量长度的限制源自Java编译器(如javac)在处理常量 ...
- PCIe简介
PCIe简介 Peripheral Component Interconnect Express (PCI),高速串行计算机扩展总线标准,PCIe对外围设备的组织方式是树形结构. 拓扑结构 根: 树的 ...
- kube-flannel.yml
--- apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: psp.flannel.unprivileged anno ...
- MacPorts 使用
安装 安装苹果命令行开发工具: xcode-select --install 下载并打开 MacPorts 安装包. 使用 MacPorts 中的软件包称为 port. sudo port selfu ...
- maven 插件之 maven-shade-plugin,解决同包同名 class 共存问题的神器
开心一刻 有一天螃蟹出门,不小心撞倒了泥鳅泥鳅很生气地说:你是不是瞎啊!螃蟹说:不是啊,我是螃蟹 概述 maven-shade-plugin 官网已经介绍的很详细了,我给大家简单翻译一下 This p ...
- docker image 变小的办法
https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/ https://medium.com/sciforce/st ...