想问一下是不是Blinker和传感器不能同时控制呀?-Arduino中文社区 - Powered by Discuz! Archiver

z1208592408 发表于 2022-4-15 11:31

想问一下是不是Blinker和传感器不能同时控制呀?

我做一个超声波控制门的,以及LED灯,程序刚开始时,只要不用Blinker控制,传感器可以一直控制,但是只要Blinker随便控制任意设备时,传感器能运行,但是就是控制不了电机,是Blinker会和传感器冲突吗?还是我代码写的有问题?请大佬指点一下。
#define BLINKER_WIFI
#include <Ticker.h>
#include <Servo.h>
#include <analogWrite.h>
#include <Blinker.h>
Ticker ticker2;
Servo myServo;
BlinkerButton Button1("btn-2gv");//车库
BlinkerSlider Slider1("ran-kh2");//红色
BlinkerSlider Slider2("ran-7yh");//绿色
BlinkerSlider Slider3("ran-03a");//蓝色


/*********************************************连接网络***********************************************/
char auth[] = "e02c47aaf828";
char ssid[] = "ABGOGO";
char pswd[] = "ABAB414AAA";
/*********************************************连接网络***********************************************/
int R = 0;
int G = 0;
int B = 0;
int States_door = 0;
const int rLedPin = 2; //引脚R
const int gLedPin = 4; //引脚G
const int bLedPin = 16; //引脚B
const int TrigPin = 23; //发射触发引脚
const int EchoPin = 22;//超声波接收引脚
float distval;//距离


void setup()
{
Serial.begin(115200);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);
WiFi.begin(ssid, pswd);
myServo.attach(15);
myServo.write(0);
//Button1.attach(button1_callback);
ticker2.attach(9,door_close);//
Slider1.attach(slider1_callback);
Slider2.attach(slider2_callback);
Slider3.attach(slider3_callback);
   while (WiFi.status() != WL_CONNECTED)
    {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(250);
      digitalWrite(LED_BUILTIN, LOW);
      delay(250);
      Serial.print(".");
    }
}


//#调节LED灯的亮度和颜色
void slider1_callback(int32_t value)//处理 slider 收到数据的回调函数
{
R = value;
analogWrite(rLedPin,R);
}
void slider2_callback(int32_t value)
{
   G= value;
analogWrite(gLedPin, G);
}
void slider3_callback(int32_t value)
{
   B = value;
   analogWrite(bLedPin, B);
}




void button1_callback(const String & state)//控制是开门与关门
{
    BLINKER_LOG("get button state: ", state);
    if(state == "on")
      {
            myServo.attach(15);
            Button1.print("on");
            myServo.write(110);
            Blinker.delay(1000);
             myServo.detach();

      }
    else if(state == "off")
      {
            myServo.attach(15);
            Button1.print("off");
            myServo.write(0);
            Button1.text("关门");
            Blinker.delay(1000);
             myServo.detach();
      }
}








void door_open()
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);//触发一个10us的高电平启动
distval = pulseIn(EchoPin,HIGH)/58;//PulseIn是一个脉冲宽度读取信号,(引脚,读取高/低电平)
if(distval < 16 && States_door = 0)
{
    myServo.write(110);
    States_door = 1;
}
}
void door_close()
{
   /*digitalWrite(TrigPin,LOW);
delayMicroseconds(2);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);//触发一个10us的高电平启动
distval = pulseIn(EchoPin,HIGH)/58;//PulseIn是一个脉冲宽度读取信号,(引脚,读取高/低电平)
if(distval > 16 && States_door == 1)*/
if( States_door == 1)
{   myServo.write(0);
    States_door = 0;
}
}






void loop()
{
Blinker.run();
door_open();   
Serial.println(distval);
Serial.println(States_door);            
}

fdf35y65 发表于 2022-4-15 23:36

本帖最后由 fdf35y65 于 2022-4-15 23:38 编辑

以下代码没有测试


void button1_callback(const String & state)    //控制是开门与关门
{
    BLINKER_LOG("get button state: ", state);
    if(state == "on")
    {
      States_door = 1;
    }
    else if(state == "off")
    {
      States_door = 0;
    }
}


void chaoshengbo();
{
    digitalWrite(TrigPin,LOW);
    blinker.delay(0.0002);
    digitalWrite(TrigPin,HIGH);
    blinker.delay(0.001);
    digitalWrite(TrigPin,LOW);//触发一个10us的高电平启动
    distval = pulseIn(EchoPin,HIGH)/58;//PulseIn是一个脉冲宽度读取信号,(引脚,读取高/低电平)
    if(distval < 16 && States_door = 0)
    {
      States_door = 1;
    }
    else
    {
      States_door = 0;
    }
}


void door_open()
{
    if (States_door == 1)
    {
      myServo.attach(15);
      Button1.print("on");
      myServo.write(110);
      Blinker.delay(1000);
      myServo.detach();
      Serial.println(States_door);
    }
    else
    {
      myServo.attach(15);
      Button1.print("off");
      myServo.write(0);
      Button1.text("关门");
      Blinker.delay(1000);
      myServo.detach();
      Serial.println(States_door);
    }
}


void loop()
{
    Blinker.run();
    chaoshengbo(); //超声波
    door_open()
}

奈何col 发表于 2022-4-15 22:44

当然可以,错误原因自查了

fdf35y65 发表于 2022-4-15 23:20

代码错了。
loop()中不能使用阻塞函数,否则blinker会掉线。
door_open()中的delayMicroseconds()需要修改为blinker.delay()

button1_callback()中不能使用延时函数,否则blinker会离线。
myServo.attach(15)等几行代码改成标志位。

z1208592408 发表于 2022-4-16 12:40

fdf35y65 发表于 2022-4-15 23:36
以下代码没有测试




太感谢您了,这问题困扰了好久,多谢大佬的指导,前边还一直以为是冲突,改了好久也不行,现在可以了,,:hug:
页: [1]
查看完整版本: 想问一下是不是Blinker和传感器不能同时控制呀?