串口控制继电器开关
参考: 官方例程 官方函数 csdn使用用户编写的继电器模块
串口指令:
//以下函数可与串口一起使用: Serial.XX() if(Serial) available() availableForWrite() begin() end() find() findUntil() flush() parseFloat() parseInt() peek() print() println() //Serial.println(val, format) val即数值,format格式,可选HEX、OCT等 read() readBytes() readBytesUntil() readString() readStringUntil() setTimeout() write() serialEvent()
Relay Model (继电器)
它可以长在上面。
但是,为了方便使用,我们在购买继电器模块时通常会购买上述模块。上面是一路继电器。
- 左边有三个引脚:一个是输入VCC、一个接地GCC、一个为信号IN。
- 右侧有三个引脚:NC常闭端(normal close),COM公共端,NO常开端(normal open)
- IN高电平时,常闭端与公共端连接;IN为低电平时NO-COM相连。
- 需要注意的是,继电器不会向左引脚供电,继电器IN引脚给高低电平只是决定把开关吸到哪里(使用电磁效应)。因此,为了达到继电器断开/关闭的效果,我们需要左侧NC-COM或NO-COM串入带电源的主回路。
例1:用串口写入C/O控制继电器关闭/打开小灯
-
思路:选用Pin向继电器传输信号IN打开串口监视器读入我们输入的符号。
-
电路:首先建立一个简单的电源电阻-Led电路;然后继电器NC、COM串入其中。
-
程序如下:
int relayPin = 8; char incomingByte = 'O'; void setup() { // put your setup code here, to run once: pinMode(relayPin,OUTPUT); //设8脚为输出、连着继电器的IN Serial.begin(9600); } void loop() { if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); if(incomingByte == 'C'){ //串口输入C时 NC、COM相连 digitalWrite(relayPin, HIGH); Serial.println(incomingByte); } if(incomingByte == 'O'){ digitalWrite(relayPin, LOW); Serial.println(incomingByte); } } }
例2:使用Node MCU代替Arduino
- 最理想的状态是用Node MCU的wifi功能控制继电器关断/打开,但在这之前不妨测试一下Node MCU
用Node MCU串口实现继电器的控制
-
接线,与Arduino一样,以D8作为控制信号IN的引脚。
-
代码修改两处:第一:初始化中relayPin引脚需要改成
int relayPin = 15;
或int relayPin=D8
这是因为ESP8266的引脚映射不同于接口(IO),如下图: 3.代码修改,第二:Serial.begin();
的传入值改为115200,同时,打开的串口监视器的波特率也要选择这个值。(ps:我这块Node MCU背面明明写着use 9600bps baud rate,可是用9600就乱码,不知道这是为啥。回复:串口传输与AT指令的波特率要求不同 )
-
例3:用NodeMCU的服务端控制小灯亮灭
- 接线不变。但是改用Web控制D8引脚
- NodeMCU相关指令见Arduino初学者-NodeMCU
- (更新:NodeMCU打开串口前都别用D8引脚!可能会使WiFi连接不上,或者串口乱码。)
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
ESP8266WebServer controlpage(80);
const char* ssid = "Xiaomi_DE92";
const char* password = "yz6689440"; //这是我家wifi啦,欢迎连接
int relayPin = 15;
void setup(){
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
WiFi.begin(ssid,password);
Serial.print("Connecting to ");
Serial.print(ssid);
Serial.println("...");
while(WiFi.status() != WL_CONNECTED){ //当ESP8266与路由器连上时会返回WL_CONNECTED
delay(500);}
Serial.println("Conection established");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //显示IP地址,可以用来在浏览器访问
controlpage.begin();
controlpage.on("/",HTTP_GET,handleRoot); //若用GET的方式打开首页,则执行子程序
controlpage.on("/Relay",HTTP_POST,handleRelay);
controlpage.onNotFound(handleNotFound);
Serial.println("HTTP controlpage started");
}
void loop(){
controlpage.handleClient(); //不断检查http的访问
}
void handleRoot(){
controlpage.send(200,"text/html","<form action=\"/Relay\" method=\"POST\"><input type=\"submit\" value=\"RelayChange\"></form>");
}
void handleRelay(){
digitalWrite(relayPin,!digitalRead(relayPin));
controlpage.sendHeader("Location","/"); //修改头文件中的键值对内容,套娃的关键
controlpage.send(303); //页面跳转代码:303
}
void handleNotFound(){
controlpage.send(404,"text/plain","404:Not found");
}