Теория
Delay
Вызов функции delay() полностью останавливает выполнение суперцикла программы. Это значит, что мы пропустим нажатие кнопки (если конечно не пользуемся прерываниями), пока мигаем светодиодом.
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
int val = digitalRead(btnPin); // упс, мы скорее всего проспали
}
Простой выход из ситуации - отслеживать, сколько времени прошло с момента прошлого моргания:
unsigned long prevTime = 0; // не забываем правильный тип
uint8_t ledOn = 0;
void loop() {
if(millis() - prevTime > 1000) { // с момента предыдущего срабатывания прошла секунда
prevTime = millis();
ledOn = !ledOn;
digitalWrite(LED_BUILTIN, ledOn);
}
int val = digitalRead(btnPin); // цикл не заблокирован! Спокойно читаем значение
}
millis()
возвращает нам число миллисекунд, прошедшее с момента запуска микроконтроллера. unsigned long
переполнится примерно через 50 дней. Обращаем внимание на предупреждения в документации:
The return value for
millis()
is of typeunsigned long
, logic errors may occur if a programmer tries to do arithmetic with smaller data types such asint
. Even signedlong
may encounter errors as its maximum value is half that of its unsigned counterpart.
analogRead, analogWrite
Помимо цифровых значений, микроконтроллер может работать с условно-аналоговыми.
andlogRead() заставит микроконтроллер прочитать напряжение на пине (для nano это пины с A0 до A7). Возвращает значение от 0 до 1024 - напряжение в попугаях.
(TODO: написать откуда попугаи берутся)
analogWrite() - запишет аналоговое значение (в виде ШИМ сигнала) на тех пинах, что поддерживают ШИМ (для nano это D3, D5, D6, D9, D10, D11). Принимает значения от 0 до 255.
Так, например, можно управлять яркостью светодиода.
Serial
На многих микроконтроллерах есть последовательный интерфейс UART
. На платах разработчика он обычно распаян на usb-uart converter (собственно благодаря нему наш компьютер определяет плату и может загружать на нее прошивку). По этому интерфейсу микроконтроллер может принимать/передавать данные. В Arduino для работы с UART есть абстракция Serial
.
void setup() {
Serial.begin(9600); // инициализация - передаем baudrate - bits per second. Может быть произвольным числом, но в основном используют общепринятые значения.
...
}
void loop() {
Serial.println("priva!") // отправляем данные
}
Как эти данные читать с компьютера - выбор за вами. Можно использовать
- Arduino IDE имеет встроенный монитор и плоттер.
minicom
в терминале.- Плагины для вашей IDE по ситуации.
Задачи
1.3 - Меняем частоту
С помощью двух кнопок(+ и -), меняем частоту мигания светодиодом от 50ms до 500ms с шагом 50ms
1.4 - Меняем яркость
Передаем по последовательному порту уровень яркости для светодиода в процентах (от 0 до 100) - светим светодиодом с этой яркостью. (удобно использовать метод map())
1.5 - Уровень освещенности
Подключить датчик temt6000
к микроконтроллеру и выводить значение в последовательный порт. В arduino IDE отобразить это значение в плоттере.