Определение времени простоя системы путем вычитания времени, когда система подает сигнал включения и когда она выключается.
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: я внес следующие изменения, но вывод по-прежнему не отображается. В программе все еще есть ошибки?
@Rajesh Anand10, 👍0
1 ответ
У вас дважды тестируется одно и то же состояние:
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 к
минутам
независимо от того, сколько минут прошло.
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Сброс Arduino с помощью ПО (каждый день)
- Та же кнопка одним кликом и двойным кликом
- Как сбросить millis()?
- Реструктурировать код для многозадачности Neopixel + ИК-пульт + ардуино
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
Я внес следующие изменения, как вы предложили, но вывод все равно не отображается. Осталось что-нибудь еще?, @Rajesh Anand10