Ардуинки, ESP, программирование
96 subscribers
51 photos
8 videos
5 files
15 links
Канал о программировании и вообще об электронике

Вот наш чат: https://yangx.top/arduinki_esp_chat
加入频道
А теперь кнопки. Обычно у них 4 ноги, но они попарно соединены. Остаётся 2 контакта. Кнопку можно подключать по разному. Обычно одна нога идёт на пин, вторая на gnd или 5В. Если на 5В, то к пину надо подключить резистор(обычно на 10 или 4,7 кОм). Вот прошивка без библиотеки:
#define BTN 3  // кнопка на д3
void setup() {
Serial.begin(9600); // настройка порта
pinMode(BTN, 2); // настройка пина на подтяжку к +
}
void loop() {
static bool flg; // флаг состояния кнопки
bool s = !digitalRead(BTN); // текущее состояние кнопки
if (s && !flg) { // кнопка нажата
flg = true;
Serial.println("Click");
}
if (!s && flg) { // кнопка отпущена
flg = false;
Serial.println("Relase");
}
}

Это минимальная обработка нажатия, в которой нет антидребезга. Все не сенсорные кнопки дребезжат, т.е. нажатие происходит не сразу, т.е. на ардуину приходит много 0 и 1. Из-за этого будут ложные срабатывания. Потом пришлю прошивку с антидребезгом

#начало
#уроки
А сейчас датчики. Они бывают простыми и сложными. Простые выдают цифровой(0 и 1, 0В и 5В(3,3В)) или аналоговый. А сложные связываются с ардуиной с помощью интерфейсов(I2C, I2S, UART, SPI и т.д.). Простые датчики могут работать и без микроконтроллера.
У простых цифровых или только аналоговых датчиков три ноги — gnd(-, знак земли), out(a0 или d0) и 5v(3,3v, vcc, +). Out подключается к любой ноге если датчик цифровой и к аналоговой, если аналоговый. Ещё есть простые цифроаналоговые датчики, у них 4 ноги — gnd, 5v, d0(цифровой) и a0(аналоговый). Подключать и a0, и d0 не обязательно. Прошивку для простых датчиков присылать не буду. Для аналоговых подойдёт прошивка потенциометра, а для цифровых там же можно заменить analogRead на digitalRead.
А со сложными датчиками всё сложнее. Потом будем разбирать самые популярные.
А потом пришлю фотографии разных датчиков.

#начало
#железки
А ещё я ввожу новый хэштег #уроки
Вот примеры простых датчиков

#железки
А теперь расскажу про светодиод. У него обычно 2 ноги, анод и катод, + и -. Для диодов нужен определённый ток. Если диод напрямую подключить к 5в, то он сгорит. Чтобы этого не произошло, используют резистор (обычно на 220ом). Программа для моргания диодом тут уже есть (см. урок про нанку). Так что вот прошивка для управления светодиодом с помощью кнопки:
#define BTN 3  // кнопка на д3
#define LED_PIN 2 // диод на д2
void setup() {
Serial.begin(9600); // настройка порта
pinMode(BTN, 2); // настройка пина на подтяжку к +
pinMode(LED_PIN, 1); // настройка пина диода на выход
}
void loop() {
static uint32_t tmr;
static bool flg; // флаг состояния кнопки
bool s = !digitalRead(BTN); // текущее состояние кнопки
if (s && !flg && millis() - tmr > 100) { // кнопка нажата
flg = true;
tmr = millis();
Serial.println("Click");
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
if (!s && flg && millis() - tmr > 100) { // кнопка отпущена
flg = false;
tmr = millis();
Serial.println("Relase");
}
}
Тут уже есть антидребезг
А сейчас пришлю схему подключения и как выглядят светодиоды

#начало
#уроки
И вот, как это всё выглядит
Кстати не у всех простых датчиков 3/4 ноги. Вот у такого микрофона на max9814 5 ног, но выдаёт он аналоговый сигнал. А ещё этот микрофон работает лучше всех остальных, так что если вам нужен микрофон, покупайте его.

#железки (точно не помню, есть такой хэштег или нет. Значит будет)
!!ОБНОВЛЕНО!!
Внимание!Объявляется конкурс на лучший ардуино(авр, есп, стм, рп2040) проект!
Условие: подписаться на этот канал и прислать в комментарии, а лучше в чат код, а ещё желательно инструкцию и схему (можно на бумажке нарисовать). В воскресенье на следующей неделе объявлю 2 победителей — одного выберу сам, а второго голосованием. Присылать можно до пятницы.
А в подарок будет скан этой недоподделки с фотографии и доработка прошивки мной.
П. С. Премиум не просите, у меня самого нет

ДОПОЛНЕНИЕ: если нет своего проекта, можно повторить чужой. Но желательно качественно. А если вообще ничего нет, можно предложить идею
А теперь коротко про вайфай в еспшках.
1. Режим АР — точка доступа от самой еспшки, запускается так:
WiFi.mode(WIFI_AP);  // настройка режима вифи
WiFi.softAP("ssid", "pass"); // имя и пароль точки доступа
2. Подключение к роутеру, режим STA:
Serial.begin(115200);  // открываем порт
WiFi.mode(WIFI_STA); // настройка режима вифи. Тут необязательно
WiFi.begin("ssid", "pass"); // ssid и пароль от роутера
while(WiFi.status() != WL_CONNECTED) { // если не подключились, пишем в порт .
delay(500);
Serial.print(".");
}
Serial.println(WiFi.localIP()); // вывод айпи адреса
П. С. Скоро будет интересный урок про вифи!
П. П. С. Т.к. я выздоровел, мне надо ходить в школу, и уроки тут будут выходить реже

#вифи
#espшки
#уроки
И кстати у меня появился ещё один чат(https://yangx.top/arduinki_esp_chat). Туда всякие проблемы и проекты присылать можно. И поговорить

П. С. Скоро пятница, пока что есть 3,5 4,5 проекта. Осталось 2 1 0 дня
1. Сейчас заметил, что у меня уже 2^5 подписчиков
2. Решил ещё немного подождать, так что только теперь объявляется конец первой части конкурса. Присылать проекты можно и дальше до (теперь) понедельника, но голосование будет сегодня, потом новые пункты добавлять нельзя
Вот проекты.
1. Светодиодный куб
2. Эффект на адресной ленте
3. Радар на лазерном дальномере
4. Гирлянда Гайвера (которая твинкли)

П. С. В четвёртом нет фотографии, но проект вроде собран. Гирлянда твинкли (гайверовская версия)
вроде если я правильно понял, то это то видео
Короче на всякий случай ещё немного подождал с результатами, но теперь точно всё.

1. Радар на лазерном дальномере (голосование)
2. Куб из диодов (т.к. его сложно делать)

П. С. Кстати я опять заболел, так что дописание прошивки откладывается
А теперь расскажу про условия.
Чтобы код выполнялся в зависимости от каких-то данных, есть условия. Это работает так:
bool a = 1, b = 0;
if (a) { // выполнится, если а = 1. Если бы а была типа инт, то выполнится и от любого другого числа (в том числе отрицательного), кроме 0
// что-то сделать
}
if (!b) { // выполнится, если б = 0
// что-то сделать
}
if (a && b) { // выполнится, если и а, и б = 1
// что-то сделать
}
if (a || b) { // выполнится, если а или б равны 1
// что-то сделать
}
Кроме иф ещё есть else
bool a;
if (a) {
// не выполнится
} else { // если !a
// выполнится
}
Проще говоря внутри скобок пишется переменная или выражение. Можно использовать операторы:
&& — И. Можно использовать and
|| — ИЛИ. Можно использовать or
== — равно
! — меняет 0 на 1 и наоборот.

Кстати. Скобку лучше писать на той же строке, где иф/else/объявление функции. Так код будет занимать меньше строчек.
А ещё в конце каждой строки(если она не пустая и не заканчивается { или } ) надо писать ;

#начало
#уроки
А теперь коротко про циклы.
Иногда бывает надо сделать много ± одинаковых команд. Чтобы не писать каждую вручную, есть циклы. Они бывают 3 видов, но обычно используют два.
1. Цикл while
bool s = 1;  // есть переменная
while (s) { // пока она ==1
s = digitalRead(3); // считывать её значение
}
В скобках пишется любое выражение. Проще говоря, это иф, но пока выражение ==1, он циклично выполняется.
ВНИМАНИЕ: если значение в скобках не меняется и не станет равным 0, цикл не завершится!!!
2. Цикл for
for (int i = 0; i < 10; i++) {
// тут можно что-то делать
}
Тут в скобках есть три части, которые разделяются ;
(объявление переменной; условие выполнения; изменение переменной)
Всё части необязательны, но ; должны быть. Например
(;i < 10;)
Внимание: если используется переменная, она должна быть объявлена!
3. Цикл do
bool s = 0;
do {
s = digitalRead(3);
} while(s);
Этот цикл почти while, но выполнится 1 раз даже если выражение в скобках изначально == 0.

Кстати ещё напишу про операторы:
>, < тут понятно
>= больше или равно
<= меньше или равно
++ плюс 1
-- минус 1

Дополнение:
a++ — к а просто прибавится 1 и вернётся старое значение
++a — к а прибавится 1 и вернётся новое значение

П. С. Скоро выйдет большой урок про сервер на есп!

#начало
#уроки