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

Вот наш чат: https://yangx.top/arduinki_esp_chat
加入频道
Всем привет! На связи я, а это канал об электронике(это и так понятно). Всего будет 8 видов сообщений(уже больше):
#начало - для новичков
#avrки - для тех, кто уже что-то знает
#espшки - для тех, кому уже мало обычных ардуинок
#вифи - для тех, кому нравится вайфай
#поделки - для тех, кто зашёл поглазеть
#ардуиноиде - фишки и настройка ArduinoIDE
#резисторы - радиоэлектроника и собирание схем
#платки - виды ардуинок, еспшек и других камушков
#уроки — ну тут всё понятно
#железки — всякие датчики и модули
#библиотеки — использование разных библиотек
#гайверхаб — гайверхаб
#адреска — адресная лента

В следующем сообщении будут основные термины
👍1
Пришло время терминов. Начнём с простого:
Ардуинка - простонародное название плат Arduino, которые могут выполнять разные функции(от открывания двери, подсветки и сигнализации, до умного дома).
Еспшка - контроллер от фирмы Espressif. Мощный, много памяти и есть wifi. Бывает esp8266(мини-версия) и esp32(тот самый очень мощный контролер). Бывает с камерой(как на фотографии канала).
Камушек, камень - микроконтроллер - простыми словами штука, которая делает то, что напишешь в прошивке. Сложными - схема из транзисторов, способная выполнять команды.
Arduino IDE - среда разработки прошивок для еспшек и ардуинок.
Из простых терминов всё. Потом будут из электроники.
#начало
#уроки
2
А теперь электроника:
ток(или сила тока) (I) - условно говоря, кол-во электронов в момент времени в проводе. Именно из-за него нельзя втыкать пальцы в розетку. Измеряется в Амперах(А)
напряжение(U) - разность потенциалов между двумя проводами: если на одном относительно нуля 3В, а на другом 8В, то напряжение 8-3=5В. Измеряется в Вольтах(В, V)
резистор - элемент, ограничивающий ток. Основная характеристика резистора - сопротивление. Измеряется в Омах(например, 5 Ом, 10кОм)
мощность(P) - произведение тока и напряжения. Измеряется в Ваттах(Вт, W)
закон Ома - главный закон электроники. I = U/R.
Более подробно про эти первые термины в этом видео и на этом сайте

постоянное напряжение - когда напряжение всегда примерно одинаковое
переменное напряжение - когда напряжение меняется(как в розетке), чаще всего синусоидой

конденсатор - элемент, который может сглаживать сигнал, задерживать заряд и отделять переменную составляющую сигнала от постоянной. Основная характеристика - ёмкость. По идее измеряется в Фарадах, но почти всегда используют микрофарад(мкФ, uF)

транзистор - полупроводниковый элемент, он усиливает сигнал. Транзисторы бывают разных видов
диод - тоже полупроводниковый элемент. Он проводит ток только в одном направлении, а ещё способен сделать из переменного тока постоянный
Это далеко не всё, но думаю пока хватит, дальше будет уже про ардуинки.
#начало
#резисторы
#уроки
2👍1
Всем привет! Сегодня я расскажу вам об ардуине нане.
Обзор платы:
Все ноги этой ардуинки делятся на 4 группы: питание(5в, 3,3в, gnd), gpio (обычные ноги, которыми можно управлять), управляющие(aref, rst) и среди gpio есть ноги для подключения специальных датчиков.
Основа этой платы — микроконтроллер ATmega328p с архитектурой AVR. В нём 30 КБ flash памяти, в которой хранится программа, 2 КБ оперативной памяти под переменные(потом расскажу про них) и 1КБ энергонезависимой еепром памяти, в которой можно хранить настройки. Частота у этого камушка небольшая, всего 16МГц, но для большинства под(д)елок этого хватает. У наны 30 ног, из них 20 обычные и 2 только аналоговые. Среди этих 20 ног есть 6 ШИМ ног(для плавного управления яркостью, скоростью и т.д.), и ещё 6 аналоговых ног. Так же у наны есть по одному интерфейсу I2C, UART, SPI. Ноги этих I2C, UART и SPI как раз та самая 4 группа из начала сообщения.
В следующем сообщении будет про программирование наны. И про то, почему лучше нана, а не уна!
#платки
#начало
#уроки
👍2🔥1
Сегодня, как и ожидалось, мы будем программировать нану. Сначала надо установить ардуино иде, заходим на офф.сайт, тычем на версию 1,8 если система 32 битная и виндовс 7 и выше, если ниже, то 1.6.13, а если 64, то можно ставить версию 2,2(можно и меньше). Теперь нужно поставить драйвер на ch340 по этой ссылке(кстати на этом сайте хорошо описан процесс установки, всё таки в телеграме есть ограничение на длину текста) . Потом запускаем ардуино иде, заходим в инструменты->плата->(AVR boards->)arduino nano. Далее, если плата китайская, надо в инструменты->процессор(загрузчик) и меняем на ATmega328p old bootloader,а порт меняем на любой, кроме com1. Если других нет, проблема с платой или кабелем.Для проверки платы можно загрузить тестовую прошивку. Она называется блинк и мигает встроенным диодом на плате. Чтобы её загрузить, переходим в файл->примеры->basic->blinc, ждём пока всё загрузится и нажимаем стрелочку в верхнем левом углу или ctrl+u. Всё! Спустя пару секунд диод начнёт мигать.
А теперь сравнение другой ардуины уны и уже известной наны:у уны столько же памяти, но унаны на 2 ноги больше. 1:0 в пользу наны.
Уна большая. Нет, огромная! А нана компактная. 2:0 в пользу наны.
Нана втыкается в макетную плату. Или по простому, в макетку. Уна висит на проводочках. 3:0.
Нану можно паять для всяких самоделок. С уной так нельзя делать. Или будет очень неудобно. 4:0
У некоторых нан разъём для прошивки микро юсб. Он легко отрывается. Стандартный для нан мини юсб сложнее оторвать. У уны громоздкий и малоудобный юсб тип б. Его практически невозможно сломать. 4:0,5.
Выбор очевиден.
#начало
#платки
#ардуиноиде
#уроки
👍2
А сегодня мы подготавливаемся а настоящему программированию. Будем изучать структуру программы.
Изначально, если открыть ардуино иде, можно увидеть следующее:
void setup() {
// put your setup code here, to run once
}
void loop() {
// put your main code here, to run repeatedly:
}
А теперь объяснение:
void setup - основная функция, внутри скобок пишутся команды, которые должны выполниться один раз. Например, инициализация датчиков, настройка пинов и т.д.
void loop() - главная функция, команды в ней повторяются циклично: выполнилась последняя и всё начинается с начала loop'a.
// слова
- комментарий. В выполнении программы не участвует. Есть ещё многострочный комментарий, у него с /* и до */ всё пропускается:
/*
Коты
Ардуинки
Ещё что-то
*/
А потом будем разбираться с переменными

#начало
#уроки
👍2
Ардуинки, ESP, программирование
А потом будем разбираться с переменными
Наконец-то дошли руки написать этот пост. Очень сильно проще показать всё на картинке. В следующем сообщении будет пример программы + типы данных
П. С. Надеюсь кто-нибудь поймёт мой почерк)
#начало
#уроки
👍3
Ардуинки, ESP, программирование
Наконец-то дошли руки написать этот пост. Очень сильно проще показать всё на картинке. В следующем сообщении будет пример программы + типы данных П. С. Надеюсь кто-нибудь поймёт мой почерк) #начало #уроки
Перед примером программы надо кое-что ещё уточнить. С переменными работают почти все математические операции(корень и степень записываются подругому). Чтобы не писать a = a + 1;
Можно написать а += 1. Ещё есть особенный оператор — %. Это остаток от деления. Например 5%2=1 , 8%3=2 , 123%100=23.

Чтобы вывести на экран переменную или какой-нибудь текст, надо написать
Serial.print("ваш текст");
ВАЖНЫЕ ДОПОЛНЕНИЯ: 1.чтобы вывести число или переменную, кавычки НЕ нужны. Для текста они обязательны!
2.этим способом весь текст выводится в одну строку, это неудобно. Если не надо выводить что-то типа
Значение 1: 1234
то лучше заменить print на println. Это выведет в столбик. 3.чтобы всё это работало, внутри {} скобок void setup надо написать Serial.begin(9600);
Это инициализация uart'а.
А сейчас программа...
#начало
#уроки
👍2
Для всего следующего, сначала надо понять, как работает макетная плата(макетка). На первой картинке её изображение, на второй показано, как соединены контакты

#начало
#уроки
Перед тем, как будет обзор железок, надо ещё кое-что рассказать. У ардуины есть 2 вида ног: цифровые и аналоговые. Почти все ноги могут быть входом и выходом сигнала. У обычных avr'ок нет ЦАПа, т.е. они не могут выдавать аналоговый сигнал. Только 0 и 1. Но есть ШИМ, и он позволяет плавно управлять яркостью, скоростью и т.д. У есп есть и ЦАП, и ШИМ. У всех обычных микроконтроллеров есть АЦП, которое преобразовывает аналоговый сигнал в цифровой. Ну и есть цифровой вход/выход. 0 или 1, 0В или 5В. Вот функции для управления этим всем на AVR :
Цифр. выход: digitalWrite(пин, значение)
Цифр. вход: digitalRead(пин)
Аналоговый вход: analogRead(пин)
ШИМ: analogWrite(пин, значение от 0 до 255)
Скоро будет остальное. И проекты!

#начало
#уроки
👍2
Сначала расскажу про потенциометр. Это резистор, сопротивлением которого можно управлять. К ардуинке он подключается просто: одна крайняя нога на gnd, другая на 5в, а средняя на аналоговую ногу ардуины(А0, А1, А2 и т.д.). Прошивка для проверки этого всего тоже простая:
#define POT_PIN A0 // пин потенциометра
void setup() {
Serial.begin(9600); // настраиваем порт
pinMode(POT_PIN, 0); // настраиваем пин
}
void loop() {
// таймер на миллисе
static uint32_t tmr;
if(millis() - tmr >= 150) {
tmr = millis();
Serial.println(analogRead(POT_PIN)); // вывод в порт
}
}
Тут в порт выводятся числа от 0 до 1024, это значение с АЦП. Ещё можно открыть плоттер(ctrl+shif+l или через инструменты).
#начало
#уроки

П. С. Дополнение: в pinMode 0 можно поменять на INPUT, это то же самое
👍1
А теперь кнопки. Обычно у них 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. Из-за этого будут ложные срабатывания. Потом пришлю прошивку с антидребезгом

#начало
#уроки
👍2
А сейчас датчики. Они бывают простыми и сложными. Простые выдают цифровой(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");
}
}
Тут уже есть антидребезг
А сейчас пришлю схему подключения и как выглядят светодиоды

#начало
#уроки
👍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/объявление функции. Так код будет занимать меньше строчек.
А ещё в конце каждой строки(если она не пустая и не заканчивается { или } ) надо писать ;

#начало
#уроки
👍1😐11
А теперь коротко про циклы.
Иногда бывает надо сделать много ± одинаковых команд. Чтобы не писать каждую вручную, есть циклы. Они бывают 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 и вернётся новое значение

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

#начало
#уроки
👍2
А сейчас коротко про библиотеки.
Иногда в проекте используются сторонние железки, работать с которыми сложно, или другие сложные штуки(вифи, веб интерфейс и другое). К счастью, хорошие люди написали всё это за нас. Нам остаётся скачать файл и подключить. Скачивается разными способами:
1. Автоматически. Надо зайти в менеджер библиотек (ctrl + shift + i), написать название и нажать скачать.
2. Вручную. Скачивается архив и распаковывается в
C:\Program Files\Arduino\libraries
Или можно в приложении нажать добавить .zip библиотеку

В прошивке это выглядит так:
#include <GyverHub.h>  // в скобках пишется название библиотеки и в конце .h Компилятор ищет библиотеку в папке с библиотеками 
#include "testlib.h" // если в кавычках — сначала компилятор ищет библиотеку в папке с проектом, а потом в папке с библиотеками
П. С. Много хороших библиотек написал Гайвер. В поиске менеджера библиотек можно написать Gyver и посмотреть. Ещё можно посмотреть на сайте Гайвера.
П. П. С. Библиотеки можно делать самим, но это уже совсем другая история

#уроки
#ардуиноиде
#начало
81
А сейчас вы узнаете, что такое функции и зачем это всё.
Очень часто в прошивке много раз повторяются почти одинаковые фрагменты кода, и чтобы каждый раз всё это не писать, придумали функции. У них есть параметры, т.е. они могут получать значение. Ещё функции могут возвращать результат. Делаются они так:
<тип> <имя> (параметры [переменные, через запятую]) {
// код
return <значение>;
}

Можно задать значение параметров по умолчанию.
Например, вот функция, которая складывает 2 числа:
int sum(int a, int b) {
return a+b;
}

Тип возвращаемого значения может быть void, значит функция ничего не возвращает. Ещё может не быть параметров, тогда скобки будут пустыми. Функции доступны глобальные переменные, она может их использовать. Чтобы вызвать функцию, надо написать её имя, а потом в скобках написать значения параметров (числа, переменные):
sum(2, 3);

Если функция возвращает значение, его можно записать в переменную или передать в другую функцию:
int t = 42;
int c = sum(t, 123);
Serial.println(sum(c, t));

Если функция ничего не возвращает, return писать не надо, но с помощью него можно завершить выполнение функции:
void func(byte *val=NULL) {
if (!val) return;
*val = 123;
}
byte a = 5;
func(&a);
// a == 123
func(); // ошибки не будет

Ещё можно делать шаблонные функции, но это совсем другая история...
#уроки
#начало
7👍21