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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 539|回复: 4

[已解答] 想问一下是不是Blinker和传感器不能同时控制呀?

[复制链接]
发表于 2022-4-15 11:31 | 显示全部楼层 |阅读模式
我做一个超声波控制门的,以及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);              
}

发表于 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()
}
发表于 2022-4-15 22:44 | 显示全部楼层
当然可以,错误原因自查了
发表于 2022-4-15 23:20 | 显示全部楼层
代码错了。
loop()中不能使用阻塞函数,否则blinker会掉线。
door_open()中的delayMicroseconds()需要修改为blinker.delay()

button1_callback()中不能使用延时函数,否则blinker会离线。
myServo.attach(15)等几行代码改成标志位。
 楼主| 发表于 2022-4-16 12:40 | 显示全部楼层
fdf35y65 发表于 2022-4-15 23:36
以下代码没有测试

太感谢您了,这问题困扰了好久,多谢大佬的指导,前边还一直以为是冲突,改了好久也不行,现在可以了,,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:40 , Processed in 0.180432 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表