А теперь расскажу про условия.
Чтобы код выполнялся в зависимости от каких-то данных, есть условия. Это работает так:
&& — И. Можно использовать and
|| — ИЛИ. Можно использовать or
== — равно
! — меняет 0 на 1 и наоборот.
Кстати. Скобку лучше писать на той же строке, где иф/else/объявление функции. Так код будет занимать меньше строчек.
А ещё в конце каждой строки(если она не пустая и не заканчивается { или } ) надо писать ;
#начало
#уроки
Чтобы код выполнялся в зависимости от каких-то данных, есть условия. Это работает так:
bool a = 1, b = 0;Кроме иф ещё есть else
if (a) { // выполнится, если а = 1. Если бы а была типа инт, то выполнится и от любого другого числа (в том числе отрицательного), кроме 0
// что-то сделать
}
if (!b) { // выполнится, если б = 0
// что-то сделать
}
if (a && b) { // выполнится, если и а, и б = 1
// что-то сделать
}
if (a || b) { // выполнится, если а или б равны 1
// что-то сделать
}
bool a;Проще говоря внутри скобок пишется переменная или выражение. Можно использовать операторы:
if (a) {
// не выполнится
} else { // если !a
// выполнится
}
&& — И. Можно использовать and
|| — ИЛИ. Можно использовать or
== — равно
! — меняет 0 на 1 и наоборот.
Кстати. Скобку лучше писать на той же строке, где иф/else/объявление функции. Так код будет занимать меньше строчек.
А ещё в конце каждой строки(если она не пустая и не заканчивается { или } ) надо писать ;
#начало
#уроки
А теперь коротко про циклы.
Иногда бывает надо сделать много ± одинаковых команд. Чтобы не писать каждую вручную, есть циклы. Они бывают 3 видов, но обычно используют два.
1. Цикл while
ВНИМАНИЕ: если значение в скобках не меняется и не станет равным 0, цикл не завершится!!!
2. Цикл for
(объявление переменной; условие выполнения; изменение переменной)
Всё части необязательны, но ; должны быть. Например
(;i < 10;)
Внимание: если используется переменная, она должна быть объявлена!
3. Цикл do
Кстати ещё напишу про операторы:
>, < тут понятно
>= больше или равно
<= меньше или равно
++ плюс 1
-- минус 1
Дополнение:
a++ — к а просто прибавится 1 и вернётся старое значение
++a — к а прибавится 1 и вернётся новое значение
П. С. Скоро выйдет большой урок про сервер на есп!
#начало
#уроки
Иногда бывает надо сделать много ± одинаковых команд. Чтобы не писать каждую вручную, есть циклы. Они бывают 3 видов, но обычно используют два.
1. Цикл while
bool s = 1; // есть переменнаяВ скобках пишется любое выражение. Проще говоря, это иф, но пока выражение ==1, он циклично выполняется.
while (s) { // пока она ==1
s = digitalRead(3); // считывать её значение
}
ВНИМАНИЕ: если значение в скобках не меняется и не станет равным 0, цикл не завершится!!!
2. Цикл for
for (int i = 0; i < 10; i++) {Тут в скобках есть три части, которые разделяются ;
// тут можно что-то делать
}
(объявление переменной; условие выполнения; изменение переменной)
Всё части необязательны, но ; должны быть. Например
(;i < 10;)
Внимание: если используется переменная, она должна быть объявлена!
3. Цикл do
bool s = 0;Этот цикл почти while, но выполнится 1 раз даже если выражение в скобках изначально == 0.
do {
s = digitalRead(3);
} while(s);
Кстати ещё напишу про операторы:
>, < тут понятно
>= больше или равно
<= меньше или равно
++ плюс 1
-- минус 1
Дополнение:
a++ — к а просто прибавится 1 и вернётся старое значение
++a — к а прибавится 1 и вернётся новое значение
П. С. Скоро выйдет большой урок про сервер на есп!
#начало
#уроки
server.ino
5.4 KB
А вот и сервер на есп. Здесь подробно объяснять не буду, в прошивке есть комментарии. Потом напишу как делать html, но если посмотреть, наверное можно продолжить по аналогии. Схема простая. Диод подключается к D4, SDA дисплея к D2, SCL к D1. До этого была кнопка, но она себя нестабильно ведёт. Поэтому вместо неё останется просто для примера отправка 1
А теперь как этим пользоваться.
1. Сначала надо включить монитор порта и поменять скорость с 9600 на 115200
2. Потом надо перезагрузить вемос. На экране будут точки, а потом появится айпи адрес
3. Его надо вбить в браузер
4. Должен появиться интерфейс
5. Всё. Можно управлять диодом и дисплеем
#уроки
#вифи
#espшки
А теперь как этим пользоваться.
1. Сначала надо включить монитор порта и поменять скорость с 9600 на 115200
2. Потом надо перезагрузить вемос. На экране будут точки, а потом появится айпи адрес
3. Его надо вбить в браузер
4. Должен появиться интерфейс
5. Всё. Можно управлять диодом и дисплеем
#уроки
#вифи
#espшки
А сейчас коротко про библиотеки.
Иногда в проекте используются сторонние железки, работать с которыми сложно, или другие сложные штуки(вифи, веб интерфейс и другое). К счастью, хорошие люди написали всё это за нас. Нам остаётся скачать файл и подключить. Скачивается разными способами:
1. Автоматически. Надо зайти в менеджер библиотек (ctrl + shift + i), написать название и нажать скачать.
2. Вручную. Скачивается архив и распаковывается в
C:\Program Files\Arduino\libraries
Или можно в приложении нажать добавить .zip библиотеку
В прошивке это выглядит так:
П. П. С. Библиотеки можно делать самим, но это уже совсем другая история
#уроки
#ардуиноиде
#начало
Иногда в проекте используются сторонние железки, работать с которыми сложно, или другие сложные штуки(вифи, веб интерфейс и другое). К счастью, хорошие люди написали всё это за нас. Нам остаётся скачать файл и подключить. Скачивается разными способами:
1. Автоматически. Надо зайти в менеджер библиотек (ctrl + shift + i), написать название и нажать скачать.
2. Вручную. Скачивается архив и распаковывается в
C:\Program Files\Arduino\libraries
Или можно в приложении нажать добавить .zip библиотеку
В прошивке это выглядит так:
#include <GyverHub.h> // в скобках пишется название библиотеки и в конце .h Компилятор ищет библиотеку в папке с библиотекамиП. С. Много хороших библиотек написал Гайвер. В поиске менеджера библиотек можно написать Gyver и посмотреть. Ещё можно посмотреть на сайте Гайвера.
#include "testlib.h" // если в кавычках — сначала компилятор ищет библиотеку в папке с проектом, а потом в папке с библиотеками
П. П. С. Библиотеки можно делать самим, но это уже совсем другая история
#уроки
#ардуиноиде
#начало
А сейчас вы узнаете, что такое гайверхаб и как им пользоваться.
Иногда бывает надо управлять железками удалённо, но заморачиваться с самостоятельной реализацией не хочется. Или просто надо управлять чем-то из интернета. Для этого Гайвер сделал гайверхаб.
1. Структура программы
В сетупе подключается вифи, настраивается mqtt, запускается хаб и подключается билдер:
В нём настраиваютя компоненты и записываются значения в переменные. Билдер обычно делают перед сетупом
b.Название(параметры);
Ещё параметры можно задавать в цепочку, как в прошлом пункте
.size(x) — размер виджета в долях
.label(s) — подпись к виджету
.color(c) — цвет
.attach(&flg) — подключить флаг
.attach(func) — подключить функцию
Все виджеты описывать не буду, есть документация
4. Установка
Надо зайти на гитхаб, тыкнуть на old, переключить. на dev, потом code и download zip. Скачается архив с библиотекой. Потом надо зайти в скетч->подключить библиотеку->добавить .zip библиотеку, выбрать файл гайверхаба и подождать.
Ещё надо установить другие библиотеки, всё подробно расписано там.
5. Документация
https://github.com/GyverLibs/GyverHub/wiki
Там написано как пользоваться гайверхабом. Хоть там и про старую версию, но некоторые вещи пересекаются. А вообще рекомендую посмотреть примеры
Это далеко не всё, так что будет ещё один хэштег #гайверхаб
П. С. Чё-то в последнее время я на процессинге много кодить стал, так что предлагайте идеи, что на нём можно сделать (процессинг — это как ардуино, но на компьютере)
П. П. С. Гайверхаб работает не только с еспшками, но это уже совсем другая история
П. П. П. С. Спойлер: возможно скоро будет автополив и машинка на управлении по вифи
#уроки
#вифи
#espшки
#библиотеки
Иногда бывает надо управлять железками удалённо, но заморачиваться с самостоятельной реализацией не хочется. Или просто надо управлять чем-то из интернета. Для этого Гайвер сделал гайверхаб.
1. Структура программы
В сетупе подключается вифи, настраивается mqtt, запускается хаб и подключается билдер:
hub.mqtt.config("test.mosquitto.org", 1883);2. Билдер
hub.onBuild(build);
hub.begin();
В нём настраиваютя компоненты и записываются значения в переменные. Билдер обычно делают перед сетупом
void build(gh::Builder& b) {3. Компоненты
GH_ROW(b, 1,
b.Button().size(2);
b.Button(););
}
b.Название(параметры);
Ещё параметры можно задавать в цепочку, как в прошлом пункте
.size(x) — размер виджета в долях
.label(s) — подпись к виджету
.color(c) — цвет
.attach(&flg) — подключить флаг
.attach(func) — подключить функцию
Все виджеты описывать не буду, есть документация
4. Установка
Надо зайти на гитхаб, тыкнуть на old, переключить. на dev, потом code и download zip. Скачается архив с библиотекой. Потом надо зайти в скетч->подключить библиотеку->добавить .zip библиотеку, выбрать файл гайверхаба и подождать.
Ещё надо установить другие библиотеки, всё подробно расписано там.
5. Документация
https://github.com/GyverLibs/GyverHub/wiki
Там написано как пользоваться гайверхабом. Хоть там и про старую версию, но некоторые вещи пересекаются. А вообще рекомендую посмотреть примеры
Это далеко не всё, так что будет ещё один хэштег #гайверхаб
П. С. Чё-то в последнее время я на процессинге много кодить стал, так что предлагайте идеи, что на нём можно сделать (процессинг — это как ардуино, но на компьютере)
П. П. С. Гайверхаб работает не только с еспшками, но это уже совсем другая история
П. П. П. С. Спойлер: возможно скоро будет автополив и машинка на управлении по вифи
#уроки
#вифи
#espшки
#библиотеки
А сейчас вы узнаете про i2c дисплей 1602(или 2004) и как с ним работать.
1. Описание
Этот дисплей — самый стандартный(может и распространённый) для ардуино поделок. Он бывает 16 символов на 2 строки, 20 на 4 и других размеров. Мы будем использовать 16 на 2 и 20 на 4. Желательно брать дисплей с i2c конвертером, т.к. будет занимать всего 2 ноги
2. Прошивка
Надо скачать библиотеку LiquidCrystal_I2C и всё
4. Подключение
Sda к A4
Scl к A5
П. С. На дисп нельзя просто так вывести русские буквы, надо немного схитрить. Но это уже совсем другая история
#уроки
#avrки (но дисп и с еспшками работает)
#железки
#библиотеки
1. Описание
Этот дисплей — самый стандартный(может и распространённый) для ардуино поделок. Он бывает 16 символов на 2 строки, 20 на 4 и других размеров. Мы будем использовать 16 на 2 и 20 на 4. Желательно брать дисплей с i2c конвертером, т.к. будет занимать всего 2 ноги
2. Прошивка
#include <LiquidCrystal_I2C.h> // подключение3. Библиотеки
LiquidCrystal_I2C lcd(0x27, 16, 2); // инициализация дисплея. 0х27 это адрес, может быть 0х3f
void setup() {
lcd.init(); // запуск
lcd.backlight(); // вкл. подсветку
lcd.clear(); // всё стереть
lcd.print("hello world"); // вывести хеллоу ворлд
lcd.setCursor(0, 1); // печатать на 2 строке
lcd.print(12345); // вывести 12345
}
void loop() {}
Надо скачать библиотеку LiquidCrystal_I2C и всё
4. Подключение
Sda к A4
Scl к A5
П. С. На дисп нельзя просто так вывести русские буквы, надо немного схитрить. Но это уже совсем другая история
#уроки
#avrки (но дисп и с еспшками работает)
#железки
#библиотеки
Спецвыпуск!
1. В прошлом году на канале был проект ромболампы. Сейчас я решил её сделать (т.к. разобрал, а она понадобилась), а она не компилится. Короче Гайвер выпустил новый гайверхаб. В ближайшее время я перепишу прошивку и пришлю сюда. А чтобы завести ту прошивку, надо скачать прошлую версию библиотеки и управлять с сайта https://hub.gyver.ru/old
#поделки
#гайверхаб
#библиотеки
2. Новый вемос
Китайцы стали делать другой вемос с type c, и он может не шиться стандартным способом. Хотя такое может быть и со старым. Для него надо выбрать плату generic esp8266 module и flash mode поставить dout
#espшки
#ардуиноиде
1. В прошлом году на канале был проект ромболампы. Сейчас я решил её сделать (т.к. разобрал, а она понадобилась), а она не компилится. Короче Гайвер выпустил новый гайверхаб. В ближайшее время я перепишу прошивку и пришлю сюда. А чтобы завести ту прошивку, надо скачать прошлую версию библиотеки и управлять с сайта https://hub.gyver.ru/old
#поделки
#гайверхаб
#библиотеки
2. Новый вемос
Китайцы стали делать другой вемос с type c, и он может не шиться стандартным способом. Хотя такое может быть и со старым. Для него надо выбрать плату generic esp8266 module и flash mode поставить dout
#espшки
#ардуиноиде
hub.gyver.ru
GyverHub v0.51b
Arduino/ESP8266/ESP32 Web Control Panel
А сейчас вы узнаете как использовать 2 ядра есп32 одновременно и зачем это + как прошить еспшку, если она не шьётся.
1. Иногда проект получается сложный криво работает. Возможно это из-за того, что не хватает частоты процессора. Поэтому отваливается вайфай и всё работает медленно. В таком случае можно использовать оба ядра (у есп32 их 2). Делается это так:
2. Еспшка может не прошиваться по нескольким причинам. Не тот юсб порт, нет драйверов, плохой кабель, проблемы с памятью и др.
Первые три пункта уже объяснялись на канале. А вот с памятью всё сложнее. Надо выбрать порт, открыть монитор порта, поставить скорость 115200 и нажать ресет на еспшке. В порт пришлётся много информации. Надо найти что-то типа 1)DIO/QIO/DOUT и 2)80MHz/40MHz. Потом зайти в инструменты, в flash mode поставить из 1), а в flash frequency из 2). И ещё. Чтобы прошить еспшку, надо зажать кнопку boot и кликнуть по reset. Потом можно прошивать
#espшки
#вифи
#ардуиноиде
#уроки
1. Иногда проект получается сложный криво работает. Возможно это из-за того, что не хватает частоты процессора. Поэтому отваливается вайфай и всё работает медленно. В таком случае можно использовать оба ядра (у есп32 их 2). Делается это так:
#define LED1 22 // пин диодаКстати всё изначально запускается на 1 ядре (втором. Нумерация с 0)
#include "soc/timer_group_reg.h" // так надо
#include "soc/timer_group_struct.h"
TaskHandle_t Task0; // задача
void setup() {
//pinMode(LED1, OUTPUT);
Serial.begin(115200); // вкл юарт
Serial.println(); // новая строка
// функция имя стёк* ? ? задача ядро
xTaskCreatePinnedToCore(core0, "Task0", 10000, NULL, 1, &Task0, 0); // подкл. задачу
// * - но это не точно
}
void loop() {
static uint32_t tmr = millis(); // таймер на миллисе
if (millis() - tmr >= 1000) {
tmr = millis();
Serial.println(millis() / 1000); // вывести время в секундах с запуска
}
}
// функция
void core0(void *p) {
pinMode(LED1, OUTPUT); // пин диода на выход
static bool flag; // флаг состояния
static uint32_t tmr2; // для таймера на миллисе
for (;;) { // вечно крутиться
if (millis() - tmr2 >= 500) { // таймер на миллисе
tmr2 = millis();
digitalWrite(LED1, flag = !flag); // мигать
}
// так надо. Чтоб ошибок не было
TIMERG0.wdt_wprotect = TIMG_WDT_WKEY_VALUE; // write enable
TIMERG0.wdt_feed = 1; // feed dog
TIMERG0.wdt_wprotect = 0; // write protect
}
}
2. Еспшка может не прошиваться по нескольким причинам. Не тот юсб порт, нет драйверов, плохой кабель, проблемы с памятью и др.
Первые три пункта уже объяснялись на канале. А вот с памятью всё сложнее. Надо выбрать порт, открыть монитор порта, поставить скорость 115200 и нажать ресет на еспшке. В порт пришлётся много информации. Надо найти что-то типа 1)DIO/QIO/DOUT и 2)80MHz/40MHz. Потом зайти в инструменты, в flash mode поставить из 1), а в flash frequency из 2). И ещё. Чтобы прошить еспшку, надо зажать кнопку boot и кликнуть по reset. Потом можно прошивать
#espшки
#вифи
#ардуиноиде
#уроки
Кстати вот эти настройки, которые надо поставить в моём случае
Спецвыпуск (частично)
1. Давно ничего не выходит, потому что сейчас 1) я хожу в школу и 2) делаю разные штуки:
Поливатор(первый вариант кода в чате, но надо поискать)
Подниматор манипулятор из картона, соплеклея и шприцов (видео в комментах)
+ читаю про новый грайверхаб.
В ближайшие время сначала будет про поливатор, потом про адресную ленту, потом про гайверхаб (ещё раз)
2. Если тут есть женщины, то с 8 марта
1. Давно ничего не выходит, потому что сейчас 1) я хожу в школу и 2) делаю разные штуки:
Поливатор(первый вариант кода в чате, но надо поискать)
Подниматор манипулятор из картона, соплеклея и шприцов (видео в комментах)
+ читаю про новый грайверхаб.
В ближайшие время сначала будет про поливатор, потом про адресную ленту, потом про гайверхаб (ещё раз)
2. Если тут есть женщины, то с 8 марта
А сейчас вы узнаете, как собрать поливатор и настроить под есп8266.
1. Сначала я думал написать всю инструкцию сюда, но вроде всё описано там: https://github.com/Yura4213/polivator. Если непонятно — пишите в комментарии, объясню. Ещё потом ожидается добавление этого в проекты гайверхаба.
2. Для есп8266 надо настроить другие ноги! В прошивке это выглядит так:
#поделки
#гайверхаб
#espшки
#вифи
П. С. А теперь я переделываю лампу
1. Сначала я думал написать всю инструкцию сюда, но вроде всё описано там: https://github.com/Yura4213/polivator. Если непонятно — пишите в комментарии, объясню. Ещё потом ожидается добавление этого в проекты гайверхаба.
2. Для есп8266 надо настроить другие ноги! В прошивке это выглядит так:
#define PIN_OUT 22 // 2надо заменить на
#define PIN_IN 34 // A0
#define _BTN 17 // 14
#define PIN_OUT 2 // 2Внимание: если не компилируется на есп8266, надо обновить все библиотеки!
#define PIN_IN A0 // A0
#define _BTN 14 // 14
#поделки
#гайверхаб
#espшки
#вифи
П. С. А теперь я переделываю лампу
GitHub
GitHub - Yura4213/polivator: Автополив на esp и GyverHub
Автополив на esp и GyverHub. Contribute to Yura4213/polivator development by creating an account on GitHub.
ledwemos4_0.zip
441.1 KB
А вот переделанная прошивка лампы. Управление (настройка вифи) как в поливаторе. Добавил возможность скрыть настройки эффекта + случайная генерация пароля.
При первом запуске еспшка создаст точку доступа. Надо подключиться и всё настроить (ssid и пароль от роутера, эффекты, кол-во диодов и др). После перезагрузки еспшки она попытается подключиться к роутеру. Потом уже из гайверхаба можно управлять еспшкой (в том числе опять настроить).
П.С. Теперь будет урок про адресные ленты
#поделки
#espшки
#вифи
#адреска
При первом запуске еспшка создаст точку доступа. Надо подключиться и всё настроить (ssid и пароль от роутера, эффекты, кол-во диодов и др). После перезагрузки еспшки она попытается подключиться к роутеру. Потом уже из гайверхаба можно управлять еспшкой (в том числе опять настроить).
П.С. Теперь будет урок про адресные ленты
#поделки
#espшки
#вифи
#адреска
А сейчас вы узнаете, как подключить адресную ленту WS2812 и управлять ей.
0. Ещё есть обычные ленты, не адресные. Они целиком светятся одним цветом. У обычных лент 4 ноги, а у адресных 3. У адресных лент можно управлять цветом каждого диода, но для них нужен икроконтроллер.
1. Подключение
GND --------- GND
DIN --470ом-- пин
5V ---------- 5в блок питания
ИЛИ
GND --------- GND
DIN --470ом-- пин
5V ---------- 5V
5V ---------- 5в блок питания
Важно! нельзя подключать ленту к ардуине без доп. питания!!! Есть 3 варианта:
1. Питать ардуину от компьютера, а ленту от бп. Ноги 5в не соединены
2. Питать и ленту, и ардуину от бп. Ноги 5в соединены
3. 1 вариант, но соединить ноги 5в. Если не повезёт(нет диода на плате ардуины), может сломаться компьютер. Но это не точно
2. Прошивка
Сначала надо подключить библиотеку FastLED и объявить массив диодов:
Для удобства можно задефайнить кол-во диодов:
В сетупе надо настроить ленту и (ОЧЕНЬ ЖЕЛАТЕЛЬНО) настроить макс.ток, чтобы не сгорел бп, а в лупе по таймеру обновлять ленту:
Всё. Можно рисовать. Вот способы:
#адреска
#железки
#библиотеки
#avrки (хотя и на есп работает)
#уроки
П.С. Схему подключения, код и внешний вид этого девайса пришлю потом
П.П.С. Медленно, но верно заканчивается кол-во оставшихся символов...(их всего ~4000. Тут 3301)
0. Ещё есть обычные ленты, не адресные. Они целиком светятся одним цветом. У обычных лент 4 ноги, а у адресных 3. У адресных лент можно управлять цветом каждого диода, но для них нужен икроконтроллер.
1. Подключение
GND --------- GND
DIN --470ом-- пин
5V ---------- 5в блок питания
ИЛИ
GND --------- GND
DIN --470ом-- пин
5V ---------- 5V
5V ---------- 5в блок питания
Важно! нельзя подключать ленту к ардуине без доп. питания!!! Есть 3 варианта:
1. Питать ардуину от компьютера, а ленту от бп. Ноги 5в не соединены
2. Питать и ленту, и ардуину от бп. Ноги 5в соединены
3. 1 вариант, но соединить ноги 5в. Если не повезёт(нет диода на плате ардуины), может сломаться компьютер. Но это не точно
2. Прошивка
Сначала надо подключить библиотеку FastLED и объявить массив диодов:
cpp
#include <FastLED.h>
CRGB leds[кол-во диодов];
Для удобства можно задефайнить кол-во диодов:
cpp
#define NUM_LEDS 50
#include <FastLED.h>
CRGB leds[NUM_LEDS];
В сетупе надо настроить ленту и (ОЧЕНЬ ЖЕЛАТЕЛЬНО) настроить макс.ток, чтобы не сгорел бп, а в лупе по таймеру обновлять ленту:
cpp
#define NUM_LEDS 50
#define CURRENT_LIMIT 1200
#define BRIGHTNESS 127 // яркость
#include <FastLED.h>
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(115200); // открываем сериал
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); // настраиваем ленту. <ЧИП, ПИН, ПОРЯДОК ЦВЕТОВ>
FastLED.setBrightness(BRIGHTNESS); // яркость
if (CURRENT_LIMIT > 0) FastLED.setMaxPowerInVoltsAndMilliamps(5, CURRENT_LIMIT); // макс. ток (напряжение в В, ток в мА)
FastLED.clear(); // залить чёрным
//fillAll(CRGB::Yellow);
FastLED.show(); // показать. Вызывать после изменений
}
void loop() {
static uint32_t tmr; // таймер на миллис
if (millis() - tmr >= (1000 / 24)) {
tmr = millis();
FastLED.show(); // показать
}
}
Всё. Можно рисовать. Вот способы:
// залить всё
void fillAll(CRGB color) {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
}
// залить
void fill(int a, int b, CRGB color) {
int dir = a > b ? -1 : 1;
for (int i = a; i < b; i+=dir) {
leds[i] = color;
}
}
// уменьшить яркость
#define SUB 0x40
void fade() {
for (int i = 0; i < NUM_LEDS; i++) {
byte &r = leds[i].r, &b = leds[i].b, &g = leds[i].g;
if (r >= SUB) r -= SUB;
else r = 0;
if (g >= SUB) g -= SUB;
else g = 0;
if (b >= SUB) b -= SUB;
else b = 0;
}
}
/*
leds[i] = col - покрасить диод #i. 1 диод это 0
fillAll(col) - залить
fill(a, b, col) - залить от a до b
fade() - плавно уменьшить яркость всей ленты
ЦВЕТ
CRGB::имя
CRGB(r, g, b)
CHSV(h, s, v)
0xRRGGBB
RR красный. 00 чёрный, FF максимальный
GG зелёный. 00 чёрный, FF максимальный
BB синий. 00 чёрный, FF максимальный
R + G = жёлтый
G + B = циановый
R + B = магентовый
R + G + B = белый
0xFF0000 — красный 0x00FF00 — зелёный
0x0000FF — синий 0xFFFF00 — жёлтый
0xFF00FF — магентовый 0x00FFFF — циановый
0xFFFFFF — белый
*/
#адреска
#железки
#библиотеки
#avrки (хотя и на есп работает)
#уроки
П.С. Схему подключения, код и внешний вид этого девайса пришлю потом
П.П.С. Медленно, но верно заканчивается кол-во оставшихся символов...(их всего ~4000. Тут 3301)
lenta_avr.zip
3.8 KB
Эффект огня доделал, так что вот прошивка. В ней несколько эффектов, они переключаются по таймеру на миллисе. Всё закомментировано, думаю можно понять. Ну и в теории это и на есп запустить можно
П.С. Кстати это почти та же прошивка лампы, но без вифи и некоторых сложных эффектов
П.С. Кстати это почти та же прошивка лампы, но без вифи и некоторых сложных эффектов
This media is not supported in your browser
VIEW IN TELEGRAM
Так, что-то давно тут ничего не было. Так что вот спойлер, а в ближайшее время будет про функции, читалку с карты памяти, обычную rgb ленту и реле
А сейчас вы узнаете, что такое функции и зачем это всё.
Очень часто в прошивке много раз повторяются почти одинаковые фрагменты кода, и чтобы каждый раз всё это не писать, придумали функции. У них есть параметры, т.е. они могут получать значение. Ещё функции могут возвращать результат. Делаются они так:
Можно задать значение параметров по умолчанию.
Например, вот функция, которая складывает 2 числа:
Тип возвращаемого значения может быть void, значит функция ничего не возвращает. Ещё может не быть параметров, тогда скобки будут пустыми. Функции доступны глобальные переменные, она может их использовать. Чтобы вызвать функцию, надо написать её имя, а потом в скобках написать значения параметров (числа, переменные):
Если функция возвращает значение, его можно записать в переменную или передать в другую функцию:
Если функция ничего не возвращает, return писать не надо, но с помощью него можно завершить выполнение функции:
Ещё можно делать шаблонные функции, но это совсем другая история...
#уроки
#начало
Очень часто в прошивке много раз повторяются почти одинаковые фрагменты кода, и чтобы каждый раз всё это не писать, придумали функции. У них есть параметры, т.е. они могут получать значение. Ещё функции могут возвращать результат. Делаются они так:
<тип> <имя> (параметры [переменные, через запятую]) {
// код
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(); // ошибки не будет
Ещё можно делать шаблонные функции, но это совсем другая история...
#уроки
#начало
Возможно в ближайшее время тут выйдет несколько уроков про сборку метеостанции мечты любого ардуинщика. Вот примерный план:
1. Олед дисплей и библиотека gyveroled
2. Датчик температуры и давления bmp280/bme280 — gyverbme
3. Датчик температуры и влажности htu21d — gyverhtu21d
4. Модуль часов ds3231 — microds3231
5. Предсказание дождя — forecaster
+Вывод всего этого на дисплей
6. Энкодер — encbutton
+ Настройка времени
7. Rgb диод
8. Ну и остальное
1. Олед дисплей и библиотека gyveroled
2. Датчик температуры и давления bmp280/bme280 — gyverbme
3. Датчик температуры и влажности htu21d — gyverhtu21d
4. Модуль часов ds3231 — microds3231
5. Предсказание дождя — forecaster
+Вывод всего этого на дисплей
6. Энкодер — encbutton
+ Настройка времени
7. Rgb диод
8. Ну и остальное
А сейчас вы узнаете, как подключить и использовать oled дисплей с библиотекой GyverOLED
1. Начало
Сей девайс часто используется в разных поделках на ардуинах (но lcd1602 вроде чаще). Это графический дисплей, 128х64(или 32) точки. Он управляется по i2c, но есть вариант с spi. Тут расскажу про 128х64 на i2c
2. Подключение
У него всего 4 ноги:
GND---GND
VCC---5V(3,3 вроде тоже можно, но это не точно. Сам дисплей от 3,3 как раз работает, но на плате стоит стабилизатор)
SCL---A5(для нанки)
SDA---A4(для нанки)
3. Прошивка
Как уже написано выше, можно и нужно использовать GyverOLED. Она кстати умеет работать с 128х32/spi. У этой библиотеки много примеров, там всё понятно написано. Можно сразу посмотреть oled_demo
Есть два способа работы с дисплеем: с буфером(картинка выводится сразу, память не тратится) и без (картинка выводится после вызова oled.update(), в памяти хранится картинка для вывода)
Вот пример программы (кстати это уменьшенный пример с частично оставленными комментариями):
(Надеюсь после сокращения кода и комментариев всё осталось понятно)
Кстати, на самом маленьком шрифте в строке получается 21 символ. Вдруг кому-то понадобится
Конец. Потом будет про bmp280/bme280
П.С. Пробелов так мало, потому что уже 3999 символов
1. Начало
Сей девайс часто используется в разных поделках на ардуинах (но lcd1602 вроде чаще). Это графический дисплей, 128х64(или 32) точки. Он управляется по i2c, но есть вариант с spi. Тут расскажу про 128х64 на i2c
2. Подключение
У него всего 4 ноги:
GND---GND
VCC---5V(3,3 вроде тоже можно, но это не точно. Сам дисплей от 3,3 как раз работает, но на плате стоит стабилизатор)
SCL---A5(для нанки)
SDA---A4(для нанки)
3. Прошивка
Как уже написано выше, можно и нужно использовать GyverOLED. Она кстати умеет работать с 128х32/spi. У этой библиотеки много примеров, там всё понятно написано. Можно сразу посмотреть oled_demo
Есть два способа работы с дисплеем: с буфером(картинка выводится сразу, память не тратится) и без (картинка выводится после вызова oled.update(), в памяти хранится картинка для вывода)
Вот пример программы (кстати это уменьшенный пример с частично оставленными комментариями):
cpp
#include <GyverOLED.h>
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
// битмап создан в ImageProcessor https://github.com/AlexGyver/imageProcessor с параметрами вывода vertical byte (OLED)
const uint8_t bitmap_32x32[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0xE0,0xF0,0x70,0x70,0x30,0x30,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xF0,0x70,0x30,0x30,0x20,0x00,0x00,
0x00,0x30,0x78,0xFC,0x7F,0x3F,0x0F,0x0F,0x1F,0x3C,0x78,0xF0,0xE0,0xC0,0x80,0x80,0x80,0x40,0xE0,0xF0,0xF8,0xFC,0xFF,0x7F,0x33,0x13,0x1E,0x1C,0x1C,0x0E,0x07,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF9,0xF7,0xEF,0x5F,0x3F,0x7F,0xFE,0xFD,0xFB,0xF1,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x0C,0x1E,0x33,0x33,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x1F,0x0E,0x04,0x00,0x00,0x00,0x00,
};
void setup() {
Serial.begin(9600);
oled.init(); //инициализация
oled.clear(); //очистить дисплей
oled.update(); //обновить.Только для режима с буфером!
oled.autoPrintln(true); //переносить текст
oled.home(); //курсор в 0,0
oled.print("Hello!"); //печатай что угодно:числа,строки,float,как Serial!
oled.update();
delay(2000);
oled.setCursor(5,1); //курсор в (пиксель X, строка Y)
oled.setScale(2);
oled.print("Hello!");
oled.update();
delay(2000);
oled.setCursorXY(15,30);//курсор в (пиксель X, пиксель Y)
oled.setScale(3);
oled.invertText(true);//инвертируй текст!
oled.print("Привет!");
oled.update();
delay(2000);
oled.clear();
oled.home();
oled.setScale(1);
oled.invertText(false);
oled.print(F("Lorem ipsum dolor sit amet, лорем ипсум долор сит амет привет мир, 123 ёлочка гори"));
oled.update();
delay(2000);
oled.home();
oled.textMode(BUF_ADD);//BUF_ADD-наложить текст BUF_SUBTRACT-вычесть текст BUF_REPLACE-заменить
oled.home();
oled.setScale(3);
oled.print("ЧТО?");
oled.update();
delay(2000);
oled.clear();
oled.dot(0,1,1);//третий аргумент:0 выкл пиксель,1 вкл пиксель
oled.line(5,5,10,10,1);//линия x0,y0,x1,y1 //пятый аргумент:0 стереть,1 нарисовать
oled.fastLineH(0,5,10,1);//горизонтальная линия (y, x1, x2) //четвёртый аргумент:0 стереть,1 нарисовать
oled.rect(5,35,35,60,OLED_STROKE);//прямоугольник (x0,y0,x1,y1)
//параметры фигуры: OLED_CLEAR-очистить OLED_FILL-залить OLED_STROKE-нарисовать рамку
oled.roundRect(50,5,80,25,OLED_STROKE);//скруглённый прямоугольник
oled.circle(60,45,5,OLED_FILL);//четвёртое-параметр фигуры
oled.update();
// битмап
oled.drawBitmap(90,16,bitmap_32x32,32,32);//по умолч. нормал и BUF_ADD //x, y, имя, ширина, высота, BITMAP_NORMAL(0)/BITMAP_INVERT(1), BUF_ADD/BUF_SUBTRACT/BUF_REPLACE
oled.update();
}
void loop() {
}
(Надеюсь после сокращения кода и комментариев всё осталось понятно)
Кстати, на самом маленьком шрифте в строке получается 21 символ. Вдруг кому-то понадобится
Конец. Потом будет про bmp280/bme280
П.С. Пробелов так мало, потому что уже 3999 символов