Привет, Мир! Продолжение

Теория

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 type unsigned long, logic errors may occur if a programmer tries to do arithmetic with smaller data types such as int. Even signed long 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 отобразить это значение в плоттере.