Arduino-ESP8266 控制舵机开门
简介
成本不到30大洋,实现手机自动开门功能!
先上效果视频:
mqtt消息控制舵机开门
准备工作
- esp8266 开发板 13¥
- Mg995 舵机 13¥
- 四个5号电池 2 ¥
- 导线若干 0.5¥
- 电池盒一个 0.5¥
成本不到30大洋,可玩性,实用性都很高。
原理图
从右往左看
- 手机上 点击 开门 按钮,发送mqtt消息到 服务器;
- esp8266开发板订阅了mqtt消息,接收到开门指令;
- esp8266发送pwm信号到舵机转动;
- 舵机 收到消息转动一定角度,拉动 门阀 ;
- 门打开。
arduino代码
主要是esp8266控制舵机转动
我这边没有用到Servo 库,原因是 提示我的开发板不在Servo 支持的架构里面。不知道为啥,有没有大佬来解惑?万分感谢!
警告: Servo 库要求运行在 avr, megaavr, sam, samd, nrf52, stm32f4,
mbed, mbed_nano, mbed_portenta, mbed_rp2040 架构(),
可能与你现在运行在 esp8266 架构上的开发板()不兼容。
废话不多说了,上Arduino 写给 esp8266的代码
//连接多个wifi
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
//网络请求
#include <ESP8266HTTPClient.h>
//mqtt 库
#include <PubSubClient.h>
#include <Ticker.h>int sp1=12;//定义舵机连接到esp8266上的接口
int pulsewidth;//定义脉宽变量
int val;
int val1;
int myangle1;int count; // Ticker计数用变量
Ticker ticker;ESP8266WiFiMulti wifiMulti; //创建一个ESP8266WiFiMulti对象
//创建 HTTPClient 对象
HTTPClient httpClient;
WiFiClient wifiClient;//mqtt服务对象
PubSubClient mqttClient(wifiClient);
//mqtt 服务器地址
const char* mqttServer = "mqtt服务器得地址";
//mqtt账号密码
const char* mqttname = "用户名";
const char* mqttpwd = "密码";
int dataIndex=0;void setup() {// put your setup code here, to run once://开启串口监视器Serial.begin(9600);
// servo.attach(12);pinMode(sp1,OUTPUT);//设定舵机接口为输出接口connWifi();//设置mqtt服务器和端口号mqttClient.setServer(mqttServer,1883);// 设置MQTT订阅回调函数mqttClient.setCallback(receiveCallback);connectMQTTServer();digitalWrite(sp1,LOW);//将舵机接口电平至低// Ticker定时对象ticker.attach(1, tickerCount);}void tickerCount(){count++;
}void connWifi(){//设置ESP8266工作模式为无线终端模式WiFi.mode(WIFI_STA);// 通过 addAP函数存储 wifi 名称,wifi密码wifiMulti.addAP("wifi_name", "wifi_pwd");wifiMulti.addAP("wifi_name2", "wifi_pwd2");Serial.println("Please wait, Connecting");int i = 0;while (wifiMulti.run() != WL_CONNECTED) {delay(1000);Serial.print(".");if(i>10) Serial.println("\n");//print(i++);}//连接wifi成功后,输出连接成功信息Serial.println("\n");Serial.print("connected to ");Serial.println(WiFi.SSID());Serial.print("IP address: \t");Serial.println(WiFi.localIP());
}void loop() {if(mqttClient.connected()){mqttClient.loop();//保持客户端心跳 // 每隔3秒钟发布一次信息if(count >3) {pubTopic(String(val1));count = 0;}}else{connectMQTTServer();}}//连接mqtt服务器
void connectMQTTServer(){//生成一个id,一般用mac地址生成,保证唯一性 WiFi.macAddress()String clientId = "random_id随机字符串";//连接服务器if(mqttClient.connect(clientId.c_str(),mqttname,mqttpwd)) {Serial.println("MQTT Server Connected.");Serial.print("Server Address:");Serial.println(mqttServer);subTopic();//订阅主题}else{Serial.println("MQTT Server Connect Failed.");Serial.println(mqttClient.state());delay(3000);}}
// 收到信息后的回调函数
void receiveCallback(char* topic, byte* payload, unsigned int length) {Serial.print("Message Received [");Serial.print(topic);Serial.print("] ");String cmd = "";for (int i = 0; i < length; i++) {cmd += (char)payload[i];}Serial.print("cmd is:");Serial.println(cmd.toInt());doAction(cmd.toInt());
}// 发布信息
void pubTopic(String msg){String topicString = "主题名称";// 主题名称不能太长,我实际发现太长了好像就发不了有效的消息char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str());// 建立发布信息。。 char publishMsg[msg.length() + 1]; strcpy(publishMsg, msg.c_str());// 实现ESP8266向主题发布信息if(mqttClient.publish(publishTopic, publishMsg)){Serial.println("Publish Topic:");Serial.println(publishTopic);Serial.println("Publish message:");Serial.println(publishMsg); } else {Serial.println("Message Publish Failed."); }
}//订阅主题消息
void subTopic(){String topString = "主题名称,要跟手机上发送的一致,才能收到";char subTop[topString.length()+1];strcpy(subTop, topString.c_str());if(mqttClient.subscribe(subTop)){Serial.println("Subscrib Topic");Serial.println(subTop);}else{Serial.println("Subscrib Fail...");}}void servopulse(int sp1,int val1)//定义一个脉冲函数
{myangle1=map(val1,0,180,500,2480);digitalWrite(sp1,HIGH);//将舵机接口电平至高delayMicroseconds(myangle1);//延时脉宽值的微秒数digitalWrite(sp1,LOW);//将舵机接口电平至低delay(20-val1/1000);
}void doAction(int val){if(val>0 && val<=9){val1=val;//将特征量转化为数值变量val1=map(val1,0,9,0,180);//将角度转化为500-2480的脉宽值Serial.print("moving servo to ");Serial.print(val1,DEC);Serial.println();for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度{servopulse(sp1,val1);//引用脉冲函数}}else{Serial.println("can not identy");}
}
前端代码
前端主要是连接mqtt服务器费点功夫,界面就一个按钮,一个点击事件还是很简单的。
我用的前端框架是angular比较小众简单贴一下代码
component部分
import { Component, OnInit,OnDestroy } from '@angular/core';import {IMqttMessage, MqttService} from 'ngx-mqtt';
import { Observable, Subscription } from 'rxjs';
import { DoorBean } from 'src/app/bean/door-bean';@Component({selector: 'app-door',templateUrl: './door.component.html',styleUrls: ['./door.component.scss']
})
export class DoorComponent implements OnInit,OnDestroy {carStatus: boolean = false;timeo: any ;item:DoorBean = new DoorBean(1,"","开门",'container');obs: Subscription;constructor(public ms: MqttService){this.obs = this.ms.observe("门的状态主题").subscribe(res=>{let status = res.payload.toString();if( status.toString() === "1"){this.carStatus = true;if(this.timeo){window.clearTimeout(this.timeo)}}else{this.carStatus = false;}this.timeo = setTimeout(() => {this.carStatus = false;}, 4000);})}ngOnInit(): void {}//点击图标onItemClick(){this.sendCmd("4")this.item.className = "press"this.item.value = "请稍等"setTimeout(() => {this.sendCmd("1")this.item.className = "container";this.item.value = "开门"}, 3000);}sendCmd(cmd: string){//发送方向指令给舵机this.ms.unsafePublish("主题名称,开发板订阅的名称跟这个保持一致", cmd, {qos: 1, retain: true});}ngOnDestroy(): void {//Called once, before the instance is destroyed.//Add 'implements OnDestroy' to the class.this.obs.unsubscribe();}}
html
<div [class]="item.className" (click)="onItemClick()">{{item.value}}
</div>
css
.container{width: 5rem;height: 5rem;background-color: #1c6eaf;margin: 0 auto;margin-top: 3rem;border-radius: 50%;color: white;text-align: center;line-height: 5rem;
}.press{@extend .container;background-color: #6a7074;
}
效果界面
总结
总体下来没啥难点,舵机转到的角度,与门阀拉动多少距离 需要动手多调一调,找出比较合适的角度。多动手试试吧,感谢您看到最后,谢谢!
Arduino-ESP8266 控制舵机开门相关推荐
- Arduino ESP8266控制SG90舵机输出PWM信号
1. 什么是舵机: 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素.舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口. 舵机是一种位置(角 ...
- arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突
一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...
- esp8266舵机驱动_使用Arduino和ESP8266通过网页控制舵机
在本文中,我们将尝试通过网页来控制舵机,通过滑动网页上对应的滑块,促使舵机做相应地运动.这样的尝试在做一些远程开关或者远程控制的小设备时非常有用,比如把 宠物定时喂食器 改造成网页控制的也是可以实现的 ...
- ESP8266+Arduino实现控制【开关外设装置-记录一】
具体实现功能:网页+APP 实现控制舵机等IO操作. 1.使用 AP 模式提供WiFi接入,终端设备通过 Web 网页实现舵机控制: 2.使用串口连接蓝牙模组,提供蓝牙接入,终端设备通过手机APP实现 ...
- Python 控制舵机
原理: UNO R3中写入控制舵机转动度数的程序,该程序一直检测:serial是否又数据,有则操作舵机. python程序负责向 serial 写入数据,并可以通过serial读取 舵机角度的信息. ...
- Arduino------红外控制舵机风扇
本篇文章,主要介绍如何使用 "红外遥控器.接收头" . "ULN2003驱动模块" 和 "继电器" 等制作一款Arduino红外控制舵机风扇 ...
- 使用ESP8266与小爱同学通过Arduino控制舵机
一.硬件 名称 数量 ESP8266开发板 1 Arduino UNO 1 MG995舵机 1 杜邦线 若干 二.开发环境配置 本实验通过Arduino IDE调用Blinker提供的SDK实现 ID ...
- 基于ESP8266远程舵机的控制与实现
一.ESP8266 CP2102介绍 NodeMCU板载ESP-12E(4MBFlash) WIFI模组和USB转TTL串口(CP2102/CH340)芯片,方便下载固件和调试, NodeMCU默认为 ...
- Arduino学习记录——蓝牙控制舵机(含LED指示灯)
文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 前言 今天记录一下有关舵机的学习,由于我的舵机在51和STM32系列单片机上都好像有供电不足的情况,然后我的电源模块也没到,所以就用Ar ...
- Arduino 控制舵机
Arduino 控制舵机 #include <Servo.h> Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧. 1.attach(接口)--设定舵机的接 ...
最新文章
- Deep Learning – Review by LeCun, Bengio, and Hinton
- 肉肉谈对需求设计的想法--到底是功能驱动界面?还是界面驱动功能?
- 20155301《信息安全系统设计基础》第六周学习总结
- vs2013 matlab 教程,Matlab 2016a和VS2013混合Dll编程步骤总结
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】
- 太赞了!这款神器一定要有!在Touch Bar上显示Dock图标工具
- Top命令找出CPU占用较高的Java线程信息
- windows下apache建立不同虚拟主机
- 什么是数据的表分区(文章附上Server 2005分区实施方案)
- 20万台联网医用输液泵中,逾10万台含未修复的老旧严重漏洞
- unreal ue4 虚幻 websocket Server websocket服务 插件使用及下载 非官方自己写的
- 计算机系统故障常用检测及排除方法有哪些,常见的电脑故障及排除方法
- Matlab实现Monte Carlo期权定价
- 谷歌seo基础:看完就能上手操作的优化方案
- 好好说话之64位格式化字符串漏洞
- 运维小白的python之路(一)
- 破解某Wifi APP,无需Root也可查看密码
- [渝粤教育] 南京邮电大学 有机电子学(双语) 参考 资料
- Win10 Rational Rose 安装教程
- HSF测试用例JVM参数Please set the HSF container path in the environment variable or JVM argument, and ensur
热门文章
- 有必要给孩子买台灯吗?2023精选专业护眼的台灯
- 学生用台灯什么光对眼睛好?开学季精选真正适合孩子的护眼台灯
- java中的nio是啥,java中的NIO
- Error: unable to connect to node rabbit@localhost: nodedown 创建消息队列用户报错
- malloc、calloc、realloc函数
- 成人大专计算机试题,2021成人大专数学模拟试题及参考答案
- 精囊妙计 -- 策略模式(Strategy Pattern) 介绍 优缺点 使用场景案例及代码演示
- 【QT】利用QT做一个键盘检测的例子
- 17,verilog之for循环
- 测试听力口语软件,上、英语系学姐最全整理的34个英语学习App 针对听力、口语、阅读...