Как заставить светодиоды включаться в соответствии с непрерывным вводом Python?

Я пытаюсь сделать тюнер. К плате Arduino подключены 3 светодиода, каждый из которых соответствует одной ситуации (слишком высокий, низкий или правильный).

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

Я придумал, как включать светодиоды по одному и держать их включенными до тех пор, пока входной сигнал не изменится, но это работает только на низкой скорости, когда я делаю это вручную с помощью программы на Python, например, такой:

code=1
while code!=0:
    code=input("Code?")
    ser.write(code.encode('utf-8')) 

Если я попробую сделать это с помощью кода Python, например:

code= '5'
while 1:
ser.write(code.encode('utf-8'))

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

Вот мой код Arduino:

int hauteur = 0;

void setup() {
    pinMode (2, OUTPUT); //красный штифт
    pinMode (6, OUTPUT); //зеленый вывод
    pinMode (5, OUTPUT); //желтый пин
    Serial.begin(9600);
}

void loop() {
    if(Serial.available ()) {
        hauteur = Serial.parseInt();

        while (hauteur==2) {
            (digitalWrite(2,HIGH));
            if (Serial.available ()) { hauteur=Serial.parseInt(); }
        }
        digitalWrite(2,LOW);

        while (hauteur==5){
            (digitalWrite(5,HIGH));
            if (Serial.available ()) { hauteur=Serial.parseInt(); }
        }
        digitalWrite(5,LOW);

        while (hauteur==6){
            (digitalWrite(6,HIGH));
            if (Serial.available ()) { hauteur=Serial.parseInt(); }
        }
        digitalWrite(6,LOW);

        Serial.flush();
    }
}

Если 2, 5 или 6 получены с достаточным интервалом между ними, то плата делает то, что должна делать, и включает соответствующий светодиод. Как мне сократить этот необходимый промежуток времени, чтобы получить изменение света в реальном времени, как у живого тюнера?

, 👍-1

Обсуждение

Попробуйте отправить не только число, но и завершающий нецифровой символ в качестве разделителя (например, "\n" символ новой строки), @chrisl

для чего Serial.flush()? вы ничего не выводите на Serial in loop(), @Juraj

создайте две переменные. текущий вывод и следующий вывод. прочитайте значение следующего вывода и ничего не делайте, если следующий вывод такой же, как текущий вывод. если они отличаются, установите для следующего вывода высокий уровень, для текущего вывода низкий уровень и установите для текущего вывода значение следующего вывода., @Juraj

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


1 ответ


1

Вам не нужно парсить Int для одной цифры. Используйте Serial.read().

  hauteur = Serial.read() - 48; // 48 — это ascii-код «0»

или лучше отправлять байты из python, а не цифровые символы

,