我正在使用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红外传感器在我的房间里建立一个访客计数器。传感器计算我房间里的人数-一个人打开灯,什么都不做,...
请确保您的两个部分非常相似,并且在2个if中更改表达式的顺序更加明显。
如果我是正确的,那么您的三元运算符语法错误,应该像:
(condition) ? (if_true) : (if_false)
注意:
这并不是对问题中单行的答案,而是对代码的简化/清理(沿着建议的注释行)。