关于控制窗户开关的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3744|回复: 7

[未解决] 关于控制窗户开关的问题

[复制链接]
发表于 2021-6-23 21:33 | 显示全部楼层 |阅读模式
现在想做的是光敏传感器检测数值大于850或小于300时电机就转动,当移动的窗户碰到窗沿的限位开关时就停止转动,
现在已经可以做到电机按条件转动和按到限位开关电机就停止转动

但问题的问题是,比如说光敏传感器数值在900是碰到限位开关是电机不停,而是不停抽搐
必须把数值降回300-850之间才能彻底停下来。
想着用中断试试看,但把代码改了之后电机一旦开始转就根本停不下来
想问问大佬们怎么解决



#include <Kenblock.h>
#include <Kenblock_Motor.h>
#include <MsTimer2.h>
#include <dht.h>

int dht11_0_getTemperature();
int dht11_0_getHumidity();


dht dht11_0;
int dht11_0_pin = 8;
int lightSensor_0 = A0;
int limitSwitch_0 = 2;
int limitSwitch_1 = 3;
Motor motor_0(MA);
float speed = 15;
float temp = 0;
float humi = 0;
float light = 0;
void openwindow() {
    if ((analogRead(lightSensor_0) >= 850) || (dht11_0_getHumidity()) >= 90) {//开窗条件
        motor_0.run(abs(speed));
    }
}
void closewindow() {
    if ((analogRead(lightSensor_0) <= 300) || (dht11_0_getHumidity()) <= 60)//关窗条件
    {
        motor_0.run(-abs(speed));
    }
}
void limit() {
    if ((digitalRead(3)) || (digitalRead(2)) == true) {
        // 如果任一个限位器为高电平就停止电机转动
        motor_0.stop();
    }
}


void setup() {
    pinMode(limitSwitch_0, INPUT_PULLUP);
    pinMode(limitSwitch_1, INPUT_PULLUP);
    Serial.begin(9600);
}


void loop() {
    temp = dht11_0_getTemperature();
    humi = dht11_0_getHumidity();
    light = analogRead(lightSensor_0);
    Serial.print("Temperature (oC): ");
    Serial.println(temp);
    Serial.print("Humidity (%): ");
    Serial.println(humi);
    Serial.print("light: ");
    limit();                              //感觉问题就在这里不知道怎么解决
    openwindow();
    closewindow();
}


int dht11_0_getTemperature() {
    int chk = dht11_0.read11(dht11_0_pin);
    int value = dht11_0.temperature;
    return value;
}
int dht11_0_getHumidity() {
    int chk = dht11_0.read11(dht11_0_pin);
    int value = dht11_0.humidity;
    return value;
}

1E1F(BGN7Y9P8KF9U]KAT@9.png
发表于 2021-6-24 09:09 | 显示全部楼层
你这个自定义limit函数,里面用的是if语句。碰到限位开关时,他会执行你的limit函数里面的内容,但是执行完之后,他会继续执行你的光敏部分。
你试试这个,把limit这部分放在光敏的判断里面
void openwindow() {
    if ((analogRead(lightSensor_0) >= 850) || (dht11_0_getHumidity()) >= 90) {//开窗条件
        motor_0.run(abs(speed));
if ((digitalRead(3)) || (digitalRead(2)) == true) {
        // 如果任一个限位器为高电平就停止电机转动
        motor_0.stop();
    }
    }
}
void closewindow() {
    if ((analogRead(lightSensor_0) <= 300) || (dht11_0_getHumidity()) <= 60)//关窗条件
    {
        motor_0.run(-abs(speed));
if ((digitalRead(3)) || (digitalRead(2)) == true) {
        // 如果任一个限位器为高电平就停止电机转动
        motor_0.stop();
    }
    }
}
 楼主| 发表于 2021-6-24 10:37 | 显示全部楼层
int_i 发表于 2021-6-24 09:09
你这个自定义limit函数,里面用的是if语句。碰到限位开关时,他会执行你的limit函数里面的内容,但是执行完 ...

感谢!问题解决了
 楼主| 发表于 2021-6-24 11:10 | 显示全部楼层

但是现在出来一个新问题,当窗子是关上的时候,限位开关一直是高电平,不能再开窗了
发表于 2021-6-24 15:53 | 显示全部楼层
这题我会 发表于 2021-6-24 11:10
但是现在出来一个新问题,当窗子是关上的时候,限位开关一直是高电平,不能再开窗了 ...

void window() {
    if ((digitalRead(3)) || (digitalRead(2)) == true)
{
        // 如果任一个限位器为高电平就停止电机转动
        motor_0.stop();
    }
else if ((analogRead(lightSensor_0) >= 850) || (dht11_0_getHumidity()) >= 90) //开窗条件
{
        motor_0.run(abs(speed));
}
else if((analogRead(lightSensor_0) <= 300) || (dht11_0_getHumidity()) <= 60)//关窗条件
{
motor_0.run(-abs(speed));
}
}
发表于 2021-6-24 15:55 | 显示全部楼层
你是不是做的一个自动升降窗帘?
发表于 2021-6-24 23:05 | 显示全部楼层
總感覺,你設了 2 種條件,但這 2 種條件又相互干涉著

比方說光敏 >=850 (天暗了)就要開窗,開完窗時限位
開關ON 了,理論上電機應該停,所以它停了,但下一次
再碰到光敏 >=850 =開窗條件又成立,電機又動了,然後
再碰到限位開關ON=電機停 就又停了,你說能不抖嗎?
估計關窗也是一樣吧?

當你把條件之一的光敏調到不作動(<850 & >300),
自然電機就只依限位關關的邏輯停止了

構成這樣的邏輯要先想如何設計條件能互相輔助
而不是相衝,比方說:
1.開窗: 光敏 >=850 AND 開窗限位開關為 OFF 時,
   電機進行開窗,在碰到開窗限位開關 ON 前
   電機持續開窗,當開窗限位開關 ON 後,電機
   就停止運轉
2.關窗:光敏 <=300 AND 關窗限位開關為 OFF 時,
   電機進行關窗,在碰到關窗限位開關 ON 前
   電機持續關窗,當關窗限位開關 ON 後,電機
   就停止運轉

可以定義旗標,相對條件成立時旗標成立,只要開/關
旗標成立,電機就依旗標指示開/關作動,當相對條件
消失後旗標不成立,電機就停止運轉

那另外有一個問題,若窗關一半才啟動這自動控制
系統,在 2 個限位開關皆 OFF 的情況下又當如何?
這也很簡單,當 2 個限位開關都 OFF 的情況就看
光敏(3個條件皆為 AND)進行開/關的旗標設立,
電機開始動後,碰到限位開關的瞬間旗標就一樣會
被清掉,電機一樣會停止

如果我想的跟樓主所要的並不一樣,那就再提出來
討論吧
发表于 2021-6-25 10:31 | 显示全部楼层
光敏控制其实不靠谱,测不准,变化大。用其他方案吧!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-29 04:40 , Processed in 0.078544 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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