Баг с несколькими ИК-детекторами
У меня есть устройство питания от arduino nano atmega328. Идея этого HW состоит в том, чтобы обнаруживать упавшие семена (кукуруза, масличные бобы и т. д.) и подсчитывать их.
Я написал исходный код, но id не работает должным образом. он увеличивает на единицу значение "channel"; (у меня 8 пар ИК диодов 3мм) автоматом, а прохождение не обнаруживает.
Возможно, вот код, у кого-то есть подобный опыт, и, возможно, он поможет мне реорганизовать код.
#include<wire.h>
#include<Adafruit_SSD1306.h>
int irPin1 = 1;
int irPin2 = 2;
int irPin3 = 3;
int irPin4 = 4;
int irPin5 = 5;
int irPin6 = 6;
int irPin7 = 7;
int irPin8 = 8;
int count1,count2,count3,count4,count5,count6,count7,count8, count = 0;
boolean state = true;
void setup(){
Serial.begin(9600);
}
void loop(){
if(!digitalRead(irPin1) && state)
{
count1++;
state = false;
Serial.print("count1: ");
Serial.println(count1);
delay(200);
}
if(digitalRead(irPin1))
{
state=true;
delay(100);
}
if(!digitalRead(irPin2) && state)
{
count2++;
state = false;
Serial.print("count2: ");
Serial.println(count2);
delay(200);
}
if(digitalRead(irPin2))
{
state=true;
delay(100);
}
if(!digitalRead(irPin3) && state)
{
count3++;
state = false;
Serial.print("count3: ");
Serial.println(count3);
delay(200);
}
if(digitalRead(irPin3))
{
state=true;
delay(100);
}
if(!digitalRead(irPin4) && state)
{
count4++;
state = false;
Serial.print("count4: ");
Serial.println(count4);
delay(200);
}
if(digitalRead(irPin4))
{
state=true;
delay(100);
}
if(!digitalRead(irPin5) && state)
{
count5++;
state = false;
Serial.print("count5: ");
Serial.println(count5);
delay(200);
}
if(digitalRead(irPin5))
{
state=true;
delay(100);
}
if(!digitalRead(irPin6) && state)
{
count6++;
state = false;
Serial.print("count6: ");
Serial.println(count6);
delay(200);
}
if(digitalRead(irPin6))
{
state=true;
delay(100);
}
if(!digitalRead(irPin7) && state)
{
count7++;
state = false;
Serial.print("count7: ");
Serial.println(count7);
delay(200);
}
if(digitalRead(irPin7))
{
state=true;
delay(100);
}
if(!digitalRead(irPin8) && state)
{
count8++;
state = false;
Serial.print("count8: ");
Serial.println(count8);
delay(200);
}
if(digitalRead(irPin8))
{
state=true;
delay(100);
}
count= count1+count2+count3+count4+count5+count6+count7+count8;
}
Я работаю в платформе IO.
@Stefan89BEG, 👍0
Обсуждение1 ответ
▲ 1
Используйте массивы вместо стиля кодирования копирования/вставки. Используйте millis() вместо операторов delay(), чтобы исключить блокирующий код. Явно настройте входные контакты.
компилируется, но не тестируется:
uint8_t irPin[ 8 ] = { 2, 3, 4, 5, 6, 7, 8, 9 } ; // установить здесь контакты датчика. Избегайте 0 и 1.
uint16_t seedCount[ 8 ] = { 0 } ;
uint32_t lastSeedAtMs[ 8 ] = { 0 } ;
const uint32_t lockOutTimeMs = 200UL ; // миллисекунды - предотвратить 1 семя, генерирующее несколько отсчетов
void setup() {
Serial.begin(9600);
for ( uint8_t channel = 0; channel < 8 ; channel++ ) {
pinMode( irPin[ channel ] , INPUT_PULLUP ) ; // настроить все входные контакты
}
}
void loop() {
for ( uint8_t channel = 0; channel < 8 ; channel++ ) {
if ( digitalRead( irPin[ channel ] ) == LOW ) { // активен низкий уровень датчика
if ( millis() - lastSeedAtMs[ channel ] > lockOutTimeMs ) { // если с момента последнего обнаружения на этом канале прошло X мс
seedCount[ channel ] ++ ;
lastSeedAtMs[channel ] = millis() ;
Serial.print("count");
Serial.print(channel);
Serial.print(": ");
Serial.println( seedCount[ channel ] );
}
}
}
}
,
@6v6gt
Смотрите также:
- Есть ли функция Adafruit для инвертирования цветов моего экрана для языка Arduino?
- Аппаратный SPI Arduino NANO не работает
- Как погасить светодиод за определенное время с помощью FastLED
- Попытка нарисовать растровое изображение на светодиодной матрице рисует только левую половину
- Библиотека SD - карт мешает работе Adafruit
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
Одна из вещей, которая сразу бросается в глаза, это то, что вы используете последовательный контакт TX для ИК-датчика, но также используете последовательный порт для отправки. То, как вы задали вопрос, это не совсем ответ., @timemage
Когда задержки активны, больше ничего нет. Вместо этого попробуйте использовать милли., @Gil
@ Гил, можешь подробнее рассказать или привести пример? что такое мили?, @Stefan89BEG
@timemage у тебя есть другое решение? который я должен использовать вместо TX и серийного номера? Я также хочу сократить код, чтобы создать какое-то событие, чтобы подписаться на него, а затем проверить, какой ir срабатывает., @Stefan89BEG
См. пример blinkWithoutDelay для использования millis() вместо delay(). Это также называется неблокирующим кодом., @RowanP
Цифровой контакт 1 используется для последовательной передачи. Избегайте использования его для любых других целей, если он вам нужен для сериалов. Выделите другой свободный контакт для датчика 1., @RowanP
вы пытаетесь бежать прежде, чем сможете ходить... заставьте это работать только с одним датчиком... затем попробуйте два датчика... это пустая трата времени для всех, включая ваше, если вы спросите о восьми датчиках, если сможете' найди одного на работу, @jsotola
@jsotola Один работает. но странно, только digitalRead(6), другие показывают, что между ними есть какое-то препятствие, хотя его нет., @Stefan89BEG
один работает хорошо ... так как другие не работают, работайте над каждым отдельно, @jsotola
используйте рабочий датчик для проверки каждого из других контактов, @jsotola