简介

成本不到30大洋,实现手机自动开门功能!
先上效果视频:

mqtt消息控制舵机开门

准备工作

  1. esp8266 开发板 13¥
  2. Mg995 舵机 13¥
  3. 四个5号电池 2 ¥
  4. 导线若干 0.5¥
  5. 电池盒一个 0.5¥
    成本不到30大洋,可玩性,实用性都很高。

原理图

从右往左看

  1. 手机上 点击 开门 按钮,发送mqtt消息到 服务器;
  2. esp8266开发板订阅了mqtt消息,接收到开门指令;
  3. esp8266发送pwm信号到舵机转动;
  4. 舵机 收到消息转动一定角度,拉动 门阀 ;
  5. 门打开。

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 控制舵机开门相关推荐

  1. Arduino ESP8266控制SG90舵机输出PWM信号

    1. 什么是舵机: 在机器人机电控制系统中,舵机控制效果是性能的重要影响因素.舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口. 舵机是一种位置(角 ...

  2. arduino定时器控制舵机_Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  3. esp8266舵机驱动_使用Arduino和ESP8266通过网页控制舵机

    在本文中,我们将尝试通过网页来控制舵机,通过滑动网页上对应的滑块,促使舵机做相应地运动.这样的尝试在做一些远程开关或者远程控制的小设备时非常有用,比如把 宠物定时喂食器 改造成网页控制的也是可以实现的 ...

  4. ESP8266+Arduino实现控制【开关外设装置-记录一】

    具体实现功能:网页+APP 实现控制舵机等IO操作. 1.使用 AP 模式提供WiFi接入,终端设备通过 Web 网页实现舵机控制: 2.使用串口连接蓝牙模组,提供蓝牙接入,终端设备通过手机APP实现 ...

  5. Python 控制舵机

    原理: UNO R3中写入控制舵机转动度数的程序,该程序一直检测:serial是否又数据,有则操作舵机. python程序负责向 serial 写入数据,并可以通过serial读取 舵机角度的信息. ...

  6. Arduino------红外控制舵机风扇

    本篇文章,主要介绍如何使用 "红外遥控器.接收头" . "ULN2003驱动模块" 和 "继电器" 等制作一款Arduino红外控制舵机风扇 ...

  7. 使用ESP8266与小爱同学通过Arduino控制舵机

    一.硬件 名称 数量 ESP8266开发板 1 Arduino UNO 1 MG995舵机 1 杜邦线 若干 二.开发环境配置 本实验通过Arduino IDE调用Blinker提供的SDK实现 ID ...

  8. 基于ESP8266远程舵机的控制与实现

    一.ESP8266 CP2102介绍 NodeMCU板载ESP-12E(4MBFlash) WIFI模组和USB转TTL串口(CP2102/CH340)芯片,方便下载固件和调试, NodeMCU默认为 ...

  9. Arduino学习记录——蓝牙控制舵机(含LED指示灯)

     文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 前言   今天记录一下有关舵机的学习,由于我的舵机在51和STM32系列单片机上都好像有供电不足的情况,然后我的电源模块也没到,所以就用Ar ...

  10. Arduino 控制舵机

    Arduino 控制舵机 #include <Servo.h> Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧. 1.attach(接口)--设定舵机的接 ...

最新文章

  1. Deep Learning – Review by LeCun, Bengio, and Hinton
  2. 肉肉谈对需求设计的想法--到底是功能驱动界面?还是界面驱动功能?
  3. 20155301《信息安全系统设计基础》第六周学习总结
  4. vs2013 matlab 教程,Matlab 2016a和VS2013混合Dll编程步骤总结
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】
  6. 太赞了!这款神器一定要有!在Touch Bar上显示Dock图标工具
  7. Top命令找出CPU占用较高的Java线程信息
  8. windows下apache建立不同虚拟主机
  9. 什么是数据的表分区(文章附上Server 2005分区实施方案)
  10. 20万台联网医用输液泵中,逾10万台含未修复的老旧严重漏洞
  11. unreal ue4 虚幻 websocket Server websocket服务 插件使用及下载 非官方自己写的
  12. 计算机系统故障常用检测及排除方法有哪些,常见的电脑故障及排除方法
  13. Matlab实现Monte Carlo期权定价
  14. 谷歌seo基础:看完就能上手操作的优化方案
  15. 好好说话之64位格式化字符串漏洞
  16. 运维小白的python之路(一)
  17. 破解某Wifi APP,无需Root也可查看密码
  18. [渝粤教育] 南京邮电大学 有机电子学(双语) 参考 资料
  19. Win10 Rational Rose 安装教程
  20. HSF测试用例JVM参数Please set the HSF container path in the environment variable or JVM argument, and ensur

热门文章

  1. 有必要给孩子买台灯吗?2023精选专业护眼的台灯
  2. 学生用台灯什么光对眼睛好?开学季精选真正适合孩子的护眼台灯
  3. java中的nio是啥,java中的NIO
  4. Error: unable to connect to node rabbit@localhost: nodedown 创建消息队列用户报错
  5. malloc、calloc、realloc函数
  6. 成人大专计算机试题,2021成人大专数学模拟试题及参考答案
  7. 精囊妙计 -- 策略模式(Strategy Pattern) 介绍 优缺点 使用场景案例及代码演示
  8. 【QT】利用QT做一个键盘检测的例子
  9. 17,verilog之for循环
  10. 测试听力口语软件,上、英语系学姐最全整理的34个英语学习App 针对听力、口语、阅读...