NodeMcu---Arduino学习-最终实现远程启动台式机

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的基本知识,
开发板的丝印对应8266的引脚

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窗口的刷新就好了
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值