基本信息

实验环境

  • Arduino IDE
  • Win 10电脑
  • 宿舍门锁:老式旋转开关门锁

实验材料

  • NodeMCU:以ESP8266为核心模块,CH9102X驱动版本(CP2102驱动升级版)
  • 4x4矩阵薄膜键盘
  • MG996R 金属标准舵机 180度(3.0-7.2V)
  • 其它:microusb数据线、面包板、杜邦线若干

NodeMCU,是一个开源的物联网平台。 它使用Lua脚本语言编程。该平台基于eLua 开源项目,底层使用ESP8266 sdk 0.9.5版本。该平台使用了很多开源项目, 例如 lua-cjson, spiffs. NodeMCU包含了可以运行在 esp8266 Wi-Fi SoC芯片之上的固件,以及基于ESP-12模组的硬件。总结来说,nodemcu本质就是ESP8266+USB转串口芯片,ESP8266是一块可编程的WIFI芯片。

(一)驱动安装、环境配置、例程运行

参考:

  • https://blog.csdn.net/qq_41904864/article/details/106202073
  • https://diyi0t.com/esp8266-nodemcu-tutorial/

驱动安装

  • 驱动下载:https://pan.baidu.com/share/init?surl=zPPIEOM2Xoz2t5JOnsYssg 提取码:y5tb
  • 驱动安装:右键管理员模式运行安装程序,默认配置即可。


  • 将电脑连接上NodeMCU,在设备管理器→端口(COM和LPT) 下查看是否显示连接上了设备,确认驱动安装成功(可以看到显示连接到了COM3端口)。

Arduino下载安装及配置

  • Arduino下载主页:https://www.arduino.cc/en/software
  • 一路点击下一步/同意即可。
  • Arduino默认界面:

  • 文件→首选项中,设置附加开发板管理器网址为:http://arduino.esp8266.com/stable/package_esp8266com_index.json

  • 点击工具→开发板→开发板管理器,搜索ESP8266,点击安装,安装该开发板定义。这里因为要从github上下载文件,可能需要科学上网(若无法科学上网,可参考这篇文章解决)。安装完成后显示installed就可以了。

  • 工具→端口选择刚刚在设备管理器看到的端口号COM3,在工具→开发板选择NodeMCU 0.9(根据自己板子的实际Module情况选择,CP2102驱动选NodeMCU 1.0也可以)。这样Arduino就可以和NodeMCU通信了。

例程运行

使用C语言编程,以下代码来自:https://www.scaugreen.cn/(这个博客的系列教程很好,推荐)

  • Arduino相关功能区如下:

    • 验证:类似编译。
    • 上传:类似编译+运行。
    • 新建、打开、保存:对文件的操作。

  • 例子一:串口通信

程序功能:NodeMCU每隔1秒向串口输出“WiFi connected”信息。

void setup() {// put your setup code here, to run once:Serial.begin(115200);delay(10);Serial.println();Serial.println();Serial.print("Connecting to ");
}void loop() {// put your main code here, to run repeatedly:Serial.println("WiFi connected");delay(1000);
}

点击验证,提示编译成功。

点击上传,NodeMCU开始运行程序(写入过程,板子上LED会闪烁),打开工具→串口监视器,可查看程序是否运行成功。注意串口监视器的波特率要调到和程序以及板子一致,否则会出现乱码。

一旦NodeMCU通电,程序就会不断地运行(可以从串口监视器看到)。按下板子USB口旁边的RST按键进行Hard Reset,会重启板子,同样也会自动运行该程序。

  • 例子二:控制LED闪烁

程序功能:NodeMCU板子上自带的LED灯循环闪烁(亮→等1秒→暗→等2秒)。注意此时无串口通信。

//如果是nodemcu V3版,需要另外定义LED引脚
//#define LED_BUILTIN 2
void setup() {pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}// the loop function runs over and over again forever
void loop() {digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level// but actually the LED is on; this is because// it is active low on the ESP-01)delay(1000);                      // Wait for a seconddigitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGHdelay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

过程同上:复制程序→验证(显示编译成功)→上传(板子LED闪烁)→上传成功,程序开始运行(LED规律闪烁)

完成上述步骤,就可以正式开始使用NodeMCU制作项目了。

(二)将老式门锁改造为简易密码锁

NodeMCU引脚图

注意此引脚图是CP2102驱动版本的(也适用于CH9102X驱动版本)。

将舵机连接至NodeMCU

舵机参数

  • 工作电压:3.0-7.2V(数据来自淘宝店家)
  • 180°舵机:可以直接控制舵机旋转的角度,但舵机只能够旋转180°。
  • 接线
    • 红色线:电源正极(接VIN,接3.3V实测电压不够);
    • 棕色线:电源负极(接GND);
    • 橙色线:信号线(接GPIO口)。

Demo

参考:https://www.zhihu.com/zvideo/1307328392610324480

代码功能:舵机缓慢地从0度转到90度,再从90度转回0度,如此循环。

#include <Servo.h>                  //加载舵机库
Servo myservo;                      //定义一个舵机对象
int _servo = 14;                    //IO14(D5)
void setup() {myservo.attach(_servo,500,2500);  //设置指定io为舵机,500和2500是为了让旋转角度正确myservo.write(0);                 //开机设置舵机为0度
}void loop() {for(int i=0;i<=180;i++){           //控制舵机角度由0度旋转到90度    myservo.write(i);               //i的值不断变大,角度偏转delay(15);                      //暂停时间,单位毫秒,用来延缓过程,展现效果}for(int i=180;i>=0;i--){           //控制舵机角度由90度返回到0度          myservo.write(i);               //i的值不断变小,角度偏转delay(15);                      //暂停时间,单位毫秒,用来延缓过程,展现效果}
}

myservo.attach的时候,需要设置和MG996R匹配的最小/最大信号脉冲宽度(5002500us,500us对应0度,2500us对应180的),Arduino默认是从5442400us,这样就会使得转动角度不是myservo.write要求的值。(参考这个回答)

将矩阵薄膜键盘连接至NodeMCU

下载并安装Keypad库

  • 在Arduino IDE的工具→管理库,选择主题“设备控制”,搜索keypad,找到Keypad by Community,点击安装。

  • Keypad库的介绍及文档见此网页:https://www.arduino.cc/reference/en/libraries/keypad/

Demo

参考:https://techtutorialsx.com/2017/03/18/esp8266-interfacing-with-a-4x4-matrix-keypad/

代码功能:按下按键,通过串口监视器输出按键结果

#include <Keypad.h>const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}
};
byte rowPins[ROWS] = {D7, D6, D5, D4}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {D3, D2, D1, D0}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );void setup(){Serial.begin(115200);
}void loop(){char key = keypad.getKey();if (key != NO_KEY){Serial.println(key);}
}

检测键盘上是否输入了正确的密码

功能:

  • 如果输入是“*”→重置输入。让用户可以删除以前的插入(也许用户错误地输入了一个字符)。
  • 如果输入是“#”→检查输入是否正确并清空输入区。

参考:https://diyi0t.com/keypad-arduino-esp8266-esp32/

#include "Keypad.h"
#include "Wire.h"const byte ROWS = 4; //four rows
const byte COLS = 4; //four columnschar keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}
};// For ESP8266 Microcontroller
byte rowPins[ROWS] = {D7, D6, D5, D4};
byte colPins[COLS] = {D3, D2, D1, D0}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);const int len_key = 3;
char master_key[len_key] = {'1','2','3'};
char attempt_key[len_key];
int z = 0;void setup() {Serial.begin(115200);Serial.println("Insert Password");
}void loop() {char key = keypad.getKey();if (key){switch(key){case '*':z=0;break;case '#':delay(100); // added debouncecheckKEY();break;default:attempt_key[z]=key;z++;}}
}void checkKEY()
{int correct=0;int i;for (i=0; i<len_key; i++) {if (attempt_key[i]==master_key[i]) {correct++;}}if (correct==len_key && z==len_key){Serial.println("Correct Key");z=0;}else{Serial.println("Incorrect Key");z=0;}for (int zz=0; zz<len_key; zz++) {attempt_key[zz]=0;}
}

通过键盘输入正确密码驱动舵机开锁

在刚刚的代码基础上加入舵机功能即可:密码输入正确,舵机旋转指定角度,等待几秒,转回0度。

#include "Keypad.h"
#include "Wire.h"
#include <Servo.h>                  //加载舵机库
Servo myservo;                      //定义一个舵机对象int _servo = 15;                    //IO15(D8)const byte ROWS = 4; //four rows
const byte COLS = 4; //four columnschar keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}
};// For ESP8266 Microcontroller
byte rowPins[ROWS] = {D7, D6, D5, D4};
byte colPins[COLS] = {D3, D2, D1, D0}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);const int len_key = 3;
char master_key[len_key] = {'1','2','3'};
char attempt_key[len_key];
int z = 0;void setup() {myservo.attach(_servo,500,2500);  //设置指定io为舵机,500和2500是为了让旋转角度正确myservo.write(0);                 //开机设置舵机为0度Serial.begin(115200);Serial.println("Insert Password");
}void loop() {char key = keypad.getKey();if (key){switch(key){case '*':z=0;break;case '#':delay(100); // added debouncecheckKEY();break;default:attempt_key[z]=key;z++;}}
}void checkKEY()
{int correct=0;int i;for (i=0; i<len_key; i++) {if (attempt_key[i]==master_key[i]) {correct++;}}if (correct==len_key && z==len_key){Serial.println("Correct Key");myservo.write(180);delay(4000);myservo.write(0);z=0;}else{Serial.println("Incorrect Key");z=0;}for (int zz=0; zz<len_key; zz++) {attempt_key[zz]=0;}
}

解决电流过小充电宝不供电的问题

使用充电宝NodeMCU供电,由于电流过小,充电宝会认为NodeMCU没有在用电,于是结束供电。

进行一番搜索,觉得诱骗负载等方式不太合适,最后选择在万能的淘宝上搜索“小电流不断电充电宝”,一般是用来充蓝牙耳机等小电流设备的,不会自动关闭,也可以用于NodeMCU供电。

一个神奇的解决方法:

实验发现,如果不进行任何操作,NodeMCU连接充电宝时是不会断电的,但是输入密码运行舵机后,过一会充电宝就会断电,但是若在运行舵机后,Reset NodeMCU,又不会断电了。

因此,将舵机运行代码之后加上一段重启命令,充电宝就不会自动断电了,也不需要购买特殊的充电宝,至于是什么原理,还不太清楚Orz。可能是因为之前用NodeMCU给舵机供电,电流太大,让NodeMCU出现了问题:

delay(6000);
ESP.restart();

最后使用不断电充电宝+面包板电源模块,分别给NodeMCU和舵机供电。

降低设备功耗

由于没有使用到Wifi功能,可通过关闭Wifi功能降低功耗。

WiFi.disconnect();
WiFi.mode(WIFI_OFF);
WiFi.forceSleepBegin();

在不使用舵机的时候,不给舵机通电。

digitalWrite(_servo, LOW); //给舵机断电
digitalWrite(_servo, HIGH); //给舵机通电

将全套设备固定到门上

门锁开关是转动式的。如图,将一根较粗、质量较好的线(最好面积大一些),一头粘到开关上,绕过某个支点(这里直接用了门环),另一头粘到舵机一端,找好舵机的位置(使得舵机一端转动180度以后刚好带动开关把门打开),最后将舵机粘在门上,经测试,在键盘输入正确密码后,舵机转动,刚好能带动开关开锁。

这里舵机的位置和角度、绳子长度、粘贴方式都需要自己调整一下,比如在初始位置时,就可以将开关转动一些,以免舵机转动距离不够。

所有粘贴均使用热熔胶完成,舵机、热熔胶、绳子的强度都比想象得要大(人工测试,通过这种方式扭动开关还是需要挺大的力)。热熔胶在一段时间后可能会失去粘性,需要重新粘一次,也可以尝试使用别的方式进行固定。

NodeMCU和充电宝放到小盒子里,将小盒子粘到门上,键盘粘到门外即可。

这样,我们成功地将老式门锁改造成了一个简易的密码锁。

NodeMCU ESP8266+Arduino:将宿舍老式门锁改造为简易密码锁相关推荐

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

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

  2. ESP8266 Arduino开发之路(2)— 连接到无线WiFi路由器

    ESP8266 Arduino开发之路(2)- 连接到无线WiFi路由器 一.前言 ESP8266可以通过WiFi连接到无线路由器,这种方式和手机通过WiFi连接无线路由器的模式是相同的,我们称该模式 ...

  3. 和ESP8266 Arduino谈场恋爱 02 这神奇的程序烧写

    前言 开发环境搭起来了,接着这篇笔记就要实现程序的烧写. 非著名情感博主 IoT小能手 twowinter,耗费数月心血,编著长篇言情小说<和ESP8266 Arduino谈场恋爱>,为广 ...

  4. Nodemcu+ESP8266实现WEB控制家用电器

    一,教程目的 通过Nodemcu+ESP8266通过网页去控制继电器以及灯泡. 二,实验环境 操作系统: windows10 硬件: ESP8266开发板 x1(CP2102)需要下载CP2102驱动 ...

  5. i58400升级可以换什么cpu_罗敏:老式碰锁可以换什么锁?老式门锁该如何

    罗敏:老式碰锁可以换什么锁?老式门锁该如何 老式碰锁相信老一辈人家里都有使用过,现在锁具新品越来越多,老式碰锁逐渐被淘汰,那么老式碰锁可以换什么锁呢?我们来了解下. 老式碰锁可以换什么锁 家里有老式碰 ...

  6. 和ESP8266 Arduino谈场恋爱

    非著名情感博主 IoT小能手 twowinter,耗费数月心血,编著长篇言情小说<和ESP8266 Arduino谈场恋爱>,为广大技术宅男传授深度撩妹技巧.是时候了,关掉屏幕上的波多野结 ...

  7. 和ESP8266 Arduino谈场恋爱 03 玩几个例程

    前言 开发环境搭起来,找几个例程玩起来. 非著名情感博主 IoT小能手 twowinter,耗费数月心血,编著长篇言情小说<和ESP8266 Arduino谈场恋爱>,为广大技术宅男传授深 ...

  8. 和ESP8266 Arduino谈场恋爱 01 一条具有中国特色的开发环境安装道路

    前言 废话不多说,环境先搞起来. 非著名情感博主 IoT小能手 twowinter,耗费数月心血,编著长篇言情小说<和ESP8266 Arduino谈场恋爱>,为广大技术宅男传授深度撩妹技 ...

  9. ESP8266 Arduino 串口监视器输出乱码原因

    最近在学习ESP8266 Arduino的时候,发现串口输出乱码,原因是串口波特率不匹配,一般Arduino默认9600波特率,图示如下: 而ESP8266 波特率是115200,也有可能是其他波特率 ...

  10. AJAX框架衣柜改造,老式衣柜改造—工作室老式衣柜改造方法介绍

    在工作室内摆放一个衣柜是可以方便自己的生活的,也是可以起到装饰的作用的.但是如果工作室的衣柜式样有些老了,就会影响到整个工作室的环境,建议进行衣柜的改造,那么老式衣柜改造的方法有哪些?我们来看看小编的 ...

最新文章

  1. 【常用算法总结——最短路径四种方法】
  2. react-router-dom v6.1.1 使用方式
  3. 使用.Net Core实现FNV分布式hash一致性算法
  4. spring boot高性能实现二维码扫码登录(上)——单服务器版
  5. 递归函数时间复杂度分析
  6. linux fork脚本,shell调度脚本的三种不同方法(fork, exec, source)
  7. python网络爬虫_爬图片
  8. 怎么得到16位校检和-c语言,16位CRC校验C语言算法.pdf
  9. 100万个不重复的8位的随机数
  10. leetcode [383] 赎金信 / Ransom Note , 空间换时间的哈希策略
  11. 读华东师范大学数学系之《数学分析》
  12. Glide的图像centerCrop处理-长短边适配
  13. 程序员垃圾简历长什么样?
  14. Excel - 图文详解Excel中相对引用和绝对引用的区别
  15. 魔趣9上手体验(坚果pro2)
  16. fastadmin 后台新增和编辑成功后刷新整个页面
  17. MySQL高可用之主备同步:电脑安装java步骤
  18. Windows更新驱动后无法开机的解决办法
  19. ZBrush软件中的笔触类型
  20. Matlab:数值积分与符号计算

热门文章

  1. 怎么用计算机测试手速,火凤凰游戏APM实时手速测试器
  2. java IO流学习总结
  3. OpenRefine开源数据清洗软件的GREL语言
  4. 当新华社遇上华为云 权威新闻全球传播再添“神器”
  5. windows cmd命令行查看结束进程
  6. 湖南职称计算机模拟试题,湖南职称计算机考试培训软件:集职称计算机考试模拟题、长沙职称计算机考试题库...
  7. 51单片机波特率计算c语言,8051单片机波特率计算公式(配套C语言例程
  8. linux交叉编译libnet,交叉编译samba(mipsel-linux) samba-3.3.3.tar.gz
  9. jsp——SmartUpload上传下载
  10. 如何自定义MATLAB神经网络激活函数