Баг с несколькими ИК-детекторами

У меня есть устройство питания от 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.

, 👍0

Обсуждение

Одна из вещей, которая сразу бросается в глаза, это то, что вы используете последовательный контакт TX для ИК-датчика, но также используете последовательный порт для отправки. То, как вы задали вопрос, это не совсем ответ., @timemage

Когда задержки активны, больше ничего нет. Вместо этого попробуйте использовать милли., @Gil

@ Гил, можешь подробнее рассказать или привести пример? что такое мили?, @Stefan89BEG

@timemage у тебя есть другое решение? который я должен использовать вместо TX и серийного номера? Я также хочу сократить код, чтобы создать какое-то событие, чтобы подписаться на него, а затем проверить, какой ir срабатывает., @Stefan89BEG

См. пример blinkWithoutDelay для использования millis() вместо delay(). Это также называется неблокирующим кодом., @RowanP

Цифровой контакт 1 используется для последовательной передачи. Избегайте использования его для любых других целей, если он вам нужен для сериалов. Выделите другой свободный контакт для датчика 1., @RowanP

вы пытаетесь бежать прежде, чем сможете ходить... заставьте это работать только с одним датчиком... затем попробуйте два датчика... это пустая трата времени для всех, включая ваше, если вы спросите о восьми датчиках, если сможете' найди одного на работу, @jsotola

@jsotola Один работает. но странно, только digitalRead(6), другие показывают, что между ними есть какое-то препятствие, хотя его нет., @Stefan89BEG

один работает хорошо ... так как другие не работают, работайте над каждым отдельно, @jsotola

используйте рабочий датчик для проверки каждого из других контактов, @jsotola


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 ] );
      }
    }
  }
}
,