233
1 准备工作
硬件
那个CD4066的开关可以不买,面包板插不上。。。我犯傻了
软件
电脑上
- Arduino 的IDE,我用的1.8.14
- 点灯科技的库
手机上就是点灯的APP
2 硬件介绍
ESP8266、ESP12F、NodeMcu
参考网址:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/esp8266-nodemcu-tutorial-index/nodemcu-hardware/
http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/esp8266-nodemcu-tutorial-index/nodemcu-board/
esp8266 : 百度一下8266就会出现乐鑫这个名字,乐鑫就是这个芯片的开发者,而且是中国公司,牛P。这个芯片是完成WIFI的全部任务的,他是一切的基础。
ESP12F 是安信可设计的一个模块,使用ESP8266芯片(可以理解在ESP8266的基础上又添加了一些其他硬件),如下图,屏蔽罩下面就是ESP8266的芯片
现在买到的都是ESP12F居多
NodeMCU则是以ESP12模块为核心的开发板,如下图所示。
而NodeMcu选购的时候常常会提到一个词 CH340芯片,这个东西是让你可以直接使用USB与NodeMcu通信,NodeMcu上的CH340芯片完成USB数据到串口数据的转换,就是有了这个芯片,我们才能非常简单的使用USB来连接ESP8266芯片。
不过CH340是老一版本的芯片,新的NodeMcu都是CH2102(贵点),CH340主要问题是挑数据线,所以如果NodeMcu插上电脑没反应,换数据线吧。
3 NodeMcu 硬件参数
参考 http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/esp8266-nodemcu-tutorial-index/nodemcu-board/
必须吹一波太极创客,简直良心的不要再良心的了,还出了免费的视频教程。
也参考了下的博客
https://blog.csdn.net/q1694222672/article/details/89214807
https://www.arduino.cn/thread-83846-1-1.html
引脚定义
下面是摘自https://blog.csdn.net/weixin_45488643/article/details/105974842的一个对应图
然后关于NodeMcu的基本知识,
NodeMcu的基本参数
那个表看不懂,可以看下面这些
NodeMcu工作电压3.3V,可以从以下几种方式供电:
USB口: 5V供电
VIN: 可输入5V供电。
3V引脚: 可以输入3.3V直接给esp8266供电。当使用其他方式供电时,该引脚可以获得3.3V电压给其他设备供电。
所有I/O输入电压都不得高于3.3V。同时请注意,这些引脚的最大输出电流是12mA。
D0~D8: 数字输入引脚。
PWM: 所有数字I/O都可用于PWM输出
串口: Serial(TX-D10/RX0-D9)可用于和计算机或其他设备通信,Serial1(TX1-D4)只有输出端口,可用向其他设备发送数据。
SPI: MISO\MOSI\SCK引脚可用于SPI通信。
IIC: 实际上D0~D8都可以用作IIC通信。
A0: 只能做模拟输入使用,输入电压范围为0~3.3V,8-bit精度。
L: 位于8266模块上的LED,该LED连接到D2引脚,可以使用宏LED_BUILTIN编程控制
可以使用开发板上印刷的Dx或引脚对应的GPIO编号控制引脚,如
a=digitalRead(D1)
a=digitalRead(5)
是等效的。
不建议使用的引脚
ESP8266芯片有17个GPIO引脚(GPIO0~GPIO16)。这些引脚中的GPIO6~GPIO 11被用于连接开发板的闪存(Flash Memory)。如果在实验电路中使用GPIO6~GPIO11,NodeMCU开发板将无法正常工作。因此建议您不要使用GPIO6~GPIO 11。
特殊引脚
- GPIO2引脚 在NodeMCU开发板启动时是不能连接低电平的。
- GPIO15引脚在开发板运行中一直保持低电平状态。因此请不要使用GPIO15引脚来读取开关状态或进行I²C通讯。
- GPIO0引脚在开发板运行中需要一直保持高电平状态。否则ESP8266将进入程序上传工作模式也就无法正常工作了。您无需对GPIO0引脚进行额外操作,因为NodeMCU的内置电路可以确保GPIO0引脚在工作时连接高电平而在上传程序时连接低电平。
总结就是:尽量使用GPIO1 对应D10 ,GPIO3对应 D9 ,GPIO13 对应 D7 ,GPIO12 对应 D6 ,GPIO14 对应 D5,GPIO4 对应 D2 ,GPIO5 对应 D1,GPIO16 对应 D0 等引脚
NodeMCU开发板配有降压电路。您可以用NodeMCU开发板的模拟输入引脚读取0-3.3V的模拟电压信号。
4 NodeMcu 按钮和LED灯
我们可以通过NodeMCU开发板上的FLASH按键控制D3引脚的电平。当我们没有按下该按键时,D3引脚将会保持高电平状态。当按下该按键后,D3引脚会变为低电平。
RST按键是让NodeMcu重新运行写入的程序
LED灯和D4直接连接,低电平灯亮(这个不知道为什么,我测试的是D4 LOW,LED灯亮。。。。。。。。)
5 Arduino环境配置
esp8266 nodeMCU arduino开发环境
https://www.jianshu.com/p/58f71aeb6633
6 Arduino 基本入门
建议看下面这个视频教程,每个都很短,看的很快的
https://www.bilibili.com/video/BV1YW411Z76E?from=search&seid=957664686341888135
7 开始使用NodeMcu
直奔主题,远程开机嘛,可以使用点灯科技的APP远程造作NodeMcu某个引脚输出高电平,然后控制(这个如何控制方法很多) 主板开机。
而主板开机的原理就是POWER_SW 的两个跳针短接一下,把POWER_SW 正的那个跳针电压拉低。
那么根据上面说的原理有两个控制方法
- 控制方法1:直接连接POWER_SW的正跳针,让板子输出低电压,直接拉低POWER_SW的正跳针的电压实现开机
- 控制方法2:让板子控制POWER_SW正负跳针的短接
我这里使用的控制方法2,因为我不太确定POWER_SW正极的跳针电压到底多大,有说3.3V的有说5V的,我手头就一个能承受3.3V的NodeMcu,直接NodeMcu控制三极管导通,让POWER_SW两个跳针接通短路。
8 进入实战前的模拟
尝试使用三极管
额,数电和物理老师看到会被打死的电路图
电路连接的时候注意发光二极管和三极管的连接方式
发光二极管长的引脚是正
三极管找到带字的一面对着你的脸,从左到右分别是集电极 基极 发射机
Arduino代码,原理就是因为按下FLASH按钮会触发D3的低电平,所以读取D3的电压,如果D3是低电平,就给连接三极管基极的D7 写入高电平,导通三极管
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // 启动串口通讯
pinMode(D3, INPUT); // 将FLASH按键引脚设置为输入模式
pinMode(D7, OUTPUT); // 将FLASH按键引脚设置为输入模式
Serial.println("开始了 ...");
}
void loop() {
// put your main code here, to run repeatedly:
int pinState = digitalRead(D3); // 获取D3引脚状态
if(pinState == HIGH){ // 当按键引脚D3为高电平,按钮没有按下
digitalWrite(D7,LOW);
}
else { // 当按键引脚D3为低电平
Serial.println("低电平,按钮按下了");
digitalWrite(D7,HIGH);
}
}
8 使用点灯科技的库
注意,别使用太新的ESP8266的库,我最初用的1.8的库,结果板子能够连接WIFI但是没法构建MQTT通信,无限循环初始化
可以参考这个教程一步步来https://www.arduino.cn/thread-83174-1-1.html
遇到问题,再去官方文档找找解决办法https://www.diandeng.tech/doc/arduino-course
然后手机上装点灯APP,新建一个设备,记住秘钥,这个点灯官网就有教程
9 开机部分实现
先用杜邦线把跳线引出来,要不然每次拔插累死了
电路很简单
- D7连接 三极管的 基极作为信号端,高电平使三极管导通
- POWER_SW+ 连接三极管集电极
- POWER_SW- 连接发射极
- NodeMcu的接地也连接POWER_SW-(共地)
代码如下,功能就是按下NodeMcu的Flash按键,会短接POWER_SW+ 和POWER_SW- ,实现台式机开机。
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // 启动串口通讯
pinMode(D3, INPUT); // 将FLASH按键引脚设置为输入模式
pinMode(D7, OUTPUT); // 控制信号
pinMode(D4, OUTPUT); // D4控制 开发板上的LED等,当我们按下FLASH按键,让LED亮,相当于个指示信号
Serial.println("开始了 ...");
digitalWrite(D4,HIGH);
digitalWrite(D7,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
int pinState = digitalRead(D3); // 获取D3引脚状态
if(pinState == HIGH){ // 当按键引脚D3为高电平,按钮没有按下
digitalWrite(D7,LOW);
digitalWrite(D4,HIGH);
}
else { // 当按键引脚D3为低电平
Serial.println("低电平,按钮按下了");
digitalWrite(D7,HIGH);
digitalWrite(D4,LOW);
}
}
10 添加开机状态监控
这一节添加状态监控保持上一节描述的开机电路没有修改,只是代码修改了,变成点灯APP上的按键触发,而不是通过按NodeMcu板子上的FLASH按键触发三级管导通。
直接读取 电源指示灯正极 或者 硬盘指示灯正极是否有电压就行,有电压了电脑就是开机了。
我这里串了两个200欧的电阻,分下电压,否则会超过NodeMcu 模拟输入的最大3.3V电压。
电路如下,另外比如主机箱LED+ 应该都是杜邦的母头,所以需要用一根公转公的杜邦线才能插到面包板上。
忽略后面乱糟糟的网线
配套的点灯APP设置如下,主要是按键和读数控件名字
总代码
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "点灯上添加硬件对应的秘钥";
char ssid[] = "无线ID";
char pswd[] = "无线密码";
// 新建按键组件对象
BlinkerButton Button1("btn-abc");
//读取电压
BlinkerNumber temp("temp");
//板子A0端口读取的模拟电压
float temp_read = 0;
//表示主板开机与否
int com_state=0;
// 按下按键即会执行该函数
void button1_callback(const String & state)
{
//串口调试输出
BLINKER_LOG("get button state: ", state);
//state是APP上按键的状态,tap表示按了一下
if (state=="tap") {
//开机命令,NodeMcu还是D7引脚接三极管基极,所以控制D7输出一下高电平
digitalWrite(D7, HIGH);
Blinker.delay(500);
//记得再写入低电平,否则就是长按关机了
digitalWrite(D7, LOW);
//电脑开机了
com_state=1;
BLINKER_LOG("触发开机");
//这个print是给手机上的点灯APP的响应
Button1.print("on");
}
//state是APP上按键的状态,press表示长按了,表示关机
else if(state=="press"){
//如果是长安关机,我们这里是 短接4S
digitalWrite(D7, HIGH);
Blinker.delay(4000);
digitalWrite(D7, LOW);
com_state=0;
BLINKER_LOG("强制关机");
// 给APP上反馈开关状态
Button1.print("off");
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
//在 void setup() 中初始化串口Serial
BLINKER_DEBUG.stream(Serial);
//调试输出更多细节信息
BLINKER_DEBUG.debugAll();
// 初始化IO
//D7 高电平控制电脑开机
pinMode(D7, OUTPUT);
digitalWrite(D7, LOW);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
//按钮组件也需要在 setup() 中注册回调函数
Button1.attach(button1_callback);
}
void loop()
{
//此函数需要频繁调用以保持设备间连接及处理收到的数据, 建议放在 loop() 函数中
Blinker.run();
//这个吧,就是电脑开机了才读电压
if(com_state==1){
//读取电压
int getADC=analogRead(A0);
int x = map(getADC,0,1023,0,32);
temp_read=(float)x/10;
//串口打印读取的电压
BLINKER_LOG("电压为: ", temp_read, " V");
Blinker.delay(500);
//下面函数就是给点灯的APP发送电压信息了
temp.print(temp_read);
}
}
另外点灯也是为了节省带宽(可以理解,毕竟白嫖了人家),APP是信息主动发起方,所以一段时间后可能APP上就接受不到电压信息了,点击debug窗口的刷新就好了