本帖最后由 逆天鲨鱼头 于 2021-10-29 00:42 编辑
想要用单片机控制宿舍开门,用到了uno、rc522和8266,还有点灯blinker的库
8266能通过wifi收到手机上的指令,uno从机能收到8266主机的数据,但是执行不了转动舵机的指令。
用8266做主机,uno从机,iic通信,舵机接在uno上。
舵机没坏,rc522识别nfc卡能正常转动舵机。
=========================================
问题代码在这里,完整代码放在后面 (代码可能有点奇怪,其实是为了验证串口通信,一直改,越来越怪)这段是iic通信 从机接受到主机数据后执行的程序
void receiveEvent(int howMany){
string = "";
while(Wire.available()>0){
char c =Wire.read();
string += c;
}
Serial.println(string);
delay(100);
myservo.write(30);
delay(2000);
myservo.write(180);
Serial.println("114514"); //这行没意义,只是验证从机能否正常收到数据,最后串口能收到,但是舵机不动
}
-----------
最后串口里能收到
open
114514
open是主机发送来的,也就是string的内容
但是舵机就是没反应
============================================
uno从机 代码如下:
#include <SPI.h>
#include <MFRC522.h>//nfc头文件
#include <Servo.h>//舵机头文件
#include <Wire.h>
MFRC522 rfid(10, 9);//创建一个rc522读卡器对象
Servo myservo;//创建一个舵机控制对象
byte nuidPICC[4];// 初始化数组用于存储读取到的NUID
String string = "";//存储从主机收到的数据
void open(){
for (int pos = 180; pos >= 30; pos --){
myservo.write(pos);
delay(5);
}
delay(2000);
myservo.write(180);
}
void receiveEvent(int howMany){
string = "";
while(Wire.available()>0){
char c =Wire.read();
string += c;
}
Serial.println(string);
delay(100);
myservo.write(30);
delay(2000);
myservo.write(180);
Serial.println("114514"); //这行没意义,只是验证从机能否正常收到数据,最后串口能收到,但是舵机不动
}
void setup(){
SPI.begin(); // 初始化SPI总线
rfid.PCD_Init();
Serial.begin(9600);
myservo.attach(6);//设定舵机的接口为6
myservo.write(180);//设定舵机旋转角度复位为0.(可调0~180)
Wire.begin(8);
Wire.onReceive(receiveEvent);
}
void loop(){
// 找卡
if ( ! rfid.PICC_IsNewCardPresent())
return;
// 验证NUID是否可读
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522:ICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 将NUID保存到nuidPICC数组
for (byte i = 0; i < 4; i++) {
nuidPICC = rfid.uid.uidByte;
Serial.print(nuidPICC);
}
Serial.println();
if (nuidPICC[0]==21&& nuidPICC[1]==17&& nuidPICC[2]==48&& nuidPICC[3]==105) { //改成自己卡的uid10
open();
}
rfid.PICC_HaltA();// 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
rfid.PCD_StopCrypto1();// 停止读卡模块编码
}
=========================================
主机:
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#include <Wire.h>
#include <Blinker.h>
char auth[] = "5075ce7143f3";
char ssid[] = "616";
char pswd[] = "lsq1439374642";
// 新建组件对象
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
BlinkerButton Button2("btn-open");
int counter = 0;
// 按下按键即会执行该函数
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
void button2_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
Wire.beginTransmission(8);
Wire.write("open");
Wire.endTransmission();
digitalWrite(LED_BUILTIN,LOW);
delay(500);
digitalWrite(LED_BUILTIN,HIGH);
}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup() {
// 初始化串口
Serial.begin(115200);
Wire.begin(D1, D2);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
}
void loop() {
Blinker.run();
}
|