Определение времени простоя системы путем вычитания времени, когда система подает сигнал включения и когда она выключается.

int pin_state = LOW;    
struct Channel {  
    byte pin;  
    byte state;  
    byte count;  
    unsigned long fell, rose;  // времена падения и подъема
};  

const int CHANNEL_COUNT = 3;  
Channel channels[CHANNEL_COUNT] = {  
    { 2, LOW, 0, 0 },  
    { 3, LOW, 0, 0 },  
    //{ 4, НИЗКИЙ, 0, 0 },
    //{ 5, НИЗКИЙ, 0, 0 },
    //{ 6, НИЗКИЙ, 0, 0 }
};

void setup()
{
    for (int i = 2; i <= CHANNEL_COUNT; ++i) {
        pinMode(channels[i].pin, INPUT);
    }
    Serial.begin(9600);
    //Serial.println("pin,fell,rose,low time");
    Serial.println("Minutes, Seconds, Count");
}

void loop()
{
    for (int i = 0; i < CHANNEL_COUNT; ++i) 
    {
        Channel &c = channels[i];
        byte new_state = digitalRead(c.pin);
        if (c.state == LOW && new_state == HIGH)   // входной сигнал увеличился
        {  
            c.rose = millis();
            c.count = c.count + 1;
        }
        else if (c.state == HIGH && new_state == LOW)  // ввод упал
        {  
            c.fell = millis();
            display_channel(c);
        }
        c.state = new_state;
    }
}

void display_channel(const Channel &c)
{
  int minutes, seconds;
  unsigned long difference;
  difference = c.fell - c.rose;
  seconds = int(difference/1000);
  if (seconds >= 60)
  {
       minutes = seconds / 60;
       seconds = seconds % 60;
  }
    //Serial.print(разница/1000);
    //Serial.print(",");
    Serial.print(minutes);
    Serial.print(",");
    Serial.print(seconds/1000);
    Serial.print(",");
    Serial.println(c.count-1);
    //Serial.print(",");
  }

В этом коде я попытался измерить время между двумя событиями (когда поступает сигнал включения и когда сигнал выключается) одновременно в двух разных каналах. Но код не выдает никаких результатов, и последовательный монитор пуст, за исключением оператора в основной функции.

Было бы полезно, если бы кто-нибудь смог найти, в чем именно заключается проблема, и найти правильное решение.

edit: я внес следующие изменения, но вывод по-прежнему не отображается. В программе все еще есть ошибки?

, 👍0


1 ответ


2

У вас дважды тестируется одно и то же состояние:

if (c.state == LOW && new_state == HIGH)   // входной сигнал вырос

и:

else if (c.state == LOW && new_state == HIGH)  // ввод упал

Если «А», иначе если «А». Это не имеет никакого смысла. Я думаю, вы хотели, чтобы второй был противоположным:

else if (c.state == HIGH && new_state == LOW)  // ввод упал

Кроме того, этот расчет в display_channel не работает:

if (seconds >= 60)
{
  seconds = seconds % 60;
  minutes = minutes + 1;
}

Например, если секунды равны 378, то секунды будут равны 18, а минуты — неопределенному числу плюс 1.

Весь этот блок следует заменить на:

minutes = seconds / 60;
seconds = seconds % 60;

В вашем коде:

  • минуты начинаются с неопределенного времени
  • Вы добавляете только 1 к минутам независимо от того, сколько минут прошло.
,

Я внес следующие изменения, как вы предложили, но вывод все равно не отображается. Осталось что-нибудь еще?, @Rajesh Anand10