关于智能房间中访客数的问题

问题描述 投票:-1回答:3

Mealy Diagram我正在使用Arduino,红外发射器和两个SHARP红外传感器在我的房间里建立一个访客计数器。传感器计算我房间里的人数-一个人打开灯,更多人什么都不做,零关闭灯。红外发射器可以很好地工作(它可以打开/关闭灯)以进行检测,但是我有一个问题。

我的问题是,是否可以选择创建一个函数并调用两次,而不是在循环中重复我自己?如果是这样,怎么办?它们大多是对称的,但仍然有一些区别,例如标志和num_people的操纵。

我现在的主要问题是计数num_people,我发现这是问题所在:num_people = (num_people > 0) ? num_people-1 : 0;当我在注释中添加此行时,我可以指望一个以上的人,但是当我不在注释中时,它会遍历代码并计数1,0、1,0、1,0(仅当进入房间时)。需要说的是,当我外出时,它会减少num_people;当它为零时,它将保持该数字。

代码在这里:


/*
    Smart Light V1.0 Software
    ==========================
    Copyright (C) 2020 Yuval Kedar - KD Tech
    The program counts visitors in my room and controls the light using SHARP IR sensors
    Board: Arduino Pro Mini
*/


#include "Arduino.h"
#include <IRremote.h>
// TODO: try a dedicated library for the sensors. Raw readings aren't the best way to do that - need to overcome oversampling, debouncing, hysteresis, etc.

#define IR_TRANSMITTER_PIN  (3)
#define SENS_1_PIN (A1)
#define SENS_2_PIN (A0)

#define SENS_1_MIN  (160)
#define SENS_2_MIN  (160)
#define MAX_TIME    (1000)
#define IR_KEY      (0x68B92)
#define DEBOUNCE_MS (300)

IRsend irsend;

uint8_t num_people = 0;
bool sens_1_flag = 0;
bool sens_2_flag = 0;
uint32_t timeout;

void setup() {
    Serial.begin(115200);
    pinMode(SENS_1_PIN, INPUT);
    pinMode(SENS_2_PIN, INPUT);
    pinMode(IR_TRANSMITTER_PIN, OUTPUT);
    Serial.println(F(
                "_______________________________\n"
                "\n"
                "      S M A R T    R O O M     \n"
                "_______________________________\n"
                "\n"
                "      Made by KD Technology    \n"
                "\n"));
}

void loop() {
    uint16_t sens_1_val = analogRead(SENS_1_PIN);
    uint16_t sens_2_val = analogRead(SENS_2_PIN);
    /*
    Serial.print("LDR 1: ");
    Serial.print(sens_1_val);
    Serial.print("\t LDR 2: ");
    Serial.println(sens_2_val);
    delay(200);
    */

    //TODO: there is a duplication here. Create a function and call it twice inside the loop.

    //Someone goes in
    if (sens_1_val < SENS_1_MIN && sens_2_val > SENS_2_MIN && sens_1_flag == 0 && sens_2_flag == 0) sens_2_flag = 1;
    if (sens_1_val > SENS_1_MIN && sens_2_val < SENS_2_MIN && sens_1_flag == 0 && sens_2_flag == 1) {
        // TODO: add timeout to while loop. Otherwise, the program will stuck because of a sensor reading.
        timeout = millis() + MAX_TIME;
        while (sens_2_val > SENS_2_MIN && (millis() > timeout));
        num_people = num_people+1;
        Serial.print("People in the room: ");
        Serial.println(num_people);
        sens_1_flag = 0;
        sens_2_flag = 0;
        delay(DEBOUNCE_MS);
        if (num_people == 1) {
            irsend.sendSony(IR_KEY, 20);
            Serial.println("BLING!");
        }
    }
    //Someone goes out
    if (sens_1_val > SENS_1_MIN && sens_2_val < SENS_2_MIN && sens_1_flag == 0 && sens_2_flag == 0) sens_1_flag = 1;
    if (sens_1_val < SENS_1_MIN && sens_2_val > SENS_2_MIN && sens_1_flag == 1 && sens_2_flag == 0) {
        timeout = millis() + MAX_TIME;
        while (sens_1_val > SENS_1_MIN && (millis() > timeout));
        num_people = (num_people > 0) ? num_people-1 : 0;
        Serial.print("People in the room: ");
        Serial.println(num_people);
        sens_1_flag = 0;
        sens_2_flag = 0;
        delay(DEBOUNCE_MS);
        if (num_people == 0) {
            irsend.sendSony(IR_KEY, 20);
            Serial.println("BLING!");
        }
    }
}

我正在使用Arduino,红外发射器和两个SHARP红外传感器在我的房间里建立一个访客计数器。传感器计算我房间里的人数-一个人打开灯,什么都不做,...

c++ arduino sensor infrared
3个回答
0
投票

请确保您的两个部分非常相似,并且在2个if中更改表达式的顺序更加明显。


0
投票

如果我是正确的,那么您的三元运算符语法错误,应该像:

(condition) ? (if_true) : (if_false)

0
投票

注意:

这并不是对问题中单行的答案,而是对代码的简化/清理(沿着建议的注释行)。
© www.soinside.com 2019 - 2024. All rights reserved.