串口控制继电器开关
参考:
官方例程
官方函数
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控制继电器关断/打开小灯
-
思路:选用Pin8传输信号给继电器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");
}