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

Вот наш чат: https://yangx.top/arduinki_esp_chat
加入频道
ledwemos4_0.zip
441.1 KB
А вот переделанная прошивка лампы. Управление (настройка вифи) как в поливаторе. Добавил возможность скрыть настройки эффекта + случайная генерация пароля.
При первом запуске еспшка создаст точку доступа. Надо подключиться и всё настроить (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 и объявить массив диодов:
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 ленту и реле
А сейчас вы узнаете, что такое функции и зачем это всё.
Очень часто в прошивке много раз повторяются почти одинаковые фрагменты кода, и чтобы каждый раз всё это не писать, придумали функции. У них есть параметры, т.е. они могут получать значение. Ещё функции могут возвращать результат. Делаются они так:
<тип> <имя> (параметры [переменные, через запятую]) {
// код
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. Ну и остальное
А сейчас вы узнаете, как подключить и использовать 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(), в памяти хранится картинка для вывода)
Вот пример программы (кстати это уменьшенный пример с частично оставленными комментариями):
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 символов
Спецвыпуск про плату защиты двух литиевых аккумуляторов

Наверно многие знают, что их нельзя напрямую подключать к нагрузке, потому что они могут переразрядиться, а если будет короткое замыкание, то в худшем случае они взорвутся. Чтобы этого не было, есть платы защиты. Одна из них, fdc-2s-2, иногда не хотела выдавать напряжение на выходе. Аккумуляторы рабочие, на входе напряжение есть, но не работает. Оказалось, чтобы она включилась, надо замкнуть P- и B-, а потом разомкнуть. Для этого можно поставить кнопку. Но есть вариант лучше: взять электролитический конденсатор. У меня подошёл на 100 мкФ. Можно чуть больше или меньше (например 47). Пока конденсатор разряжен, он пропускает ток, когда зарядится — нет. Важный момент: + конденсатора надо подключить на P-, а - на B-
П. С. Так происходит скорее всего потому что плата ждёт подключения зарядки, а если её нет, то вместо неё можно подключить те же самые аккумуляторы
П. П. С. Способ придумал не я, а ЭндПортал, хотя нечто похожее можно найти на старинных форумах
А сейчас вы узнаете, как подключить и использовать датчик bmp/bme280 с библиотекой GyverBME280
1. Начало
Это точный датчик температуры(-40..+85*С) и давления(300-1100гПа)(если bmp), а bme ещё может измерять влажность(0..100%). Он работает от 3,3В, но на некоторых платах есть стабилизатор.
2. Подключение
У одной версии 4 ноги. Работает по I2C:
GND---GND
VCC---5V/3,3. На этой плате скорее всего будет стабилизатор
SCL---A5(для нанки)
SDA---A4(для нанки)
У другой версии 6 ног. Она может работать по SPI или I2C:
GND---GND
VCC---3,3. Стабилизатора там нет
I2C:
SCL---A5(для нанки)
SDA---A4(для нанки)
SPI:
SCL---D13
SDA---D11
CSB---D10 или др. свободный (ChipSelect)
SDO---D12
3. Прошивка
Для сего девайса есть несколько библиотек: от адафрута и от Гайвера. Гайверовская поддерживает только I2C (вроде), а от адафрута всё, но она тяжелее. Лучше исполдьзовать I2C, занимает мало ног, а ещё туда можно приделать, например, тот же дисплей. Так что пример будет из GyverBME
cpp  
#include <GyverBME280.h> // Подключение библиотеки
GyverBME280 bme; // Создание объекта bme

void setup() {
Serial.begin(9600); // Запуск последовательного порта
bme.begin(); // Если доп. настройки не нужны - инициализируем датчик
}

void loop() {
Serial.print("Temperature: ");
Serial.print(bme.readTemperature()); // Выводим температуру в [*C]
Serial.println(" *C");

Serial.print("Humidity: ");
Serial.print(bme.readHumidity()); // Выводим влажность в [%]
Serial.println(" %");

float pressure = bme.readPressure(); // Читаем давление в [Па]
Serial.print("Pressure: ");
Serial.print(pressure / 100.0F); // Выводим давление в [гПа]
Serial.print(" hPa , ");
Serial.print(pressureToMmHg(pressure)); // Выводим давление в [мм рт. столба]
Serial.println(" mm Hg");
Serial.print("Altitide: ");
Serial.print(pressureToAltitude(pressure)); // Выводим высоту в [м над ур. моря]
Serial.println(" m");
Serial.println("");
delay(1000);
}


Если пишет, что влажность 0%, то это не bme, а bmp.
#уроки
#железки
#avrки (с еспшками тоже работает)
А сейчас вы узнаете, как подключить и использовать датчик htu21d с библиотекой GyverHTU21D
1. Начало
Это датчик температуры(-40..+105*С) и влажности(0..100%). Он работает от 3,3В(как и bmp280), но почти на всех платах есть стабилизатор. Хотя находил и без него
2. Подключение
У него тоже 4 ноги. Работает по I2C:
GND---GND
VIN/3.3---5V/3.3.
SCL---A5(для нанки)
SDA---A4(для нанки)

Ещё где-то видел, что красный модуль(без стабилизатора) надо подключать через конвертер уровней, так что лучше брать синий. Он и компактней
3. Прошивка
Для этого датчика (как обычно) есть несколько библиотек: от адафрута(вроде), SparkFunHTU21D и от Гайвера. Использовать будем GyverHTU21D
Вот один пример программы, опять из библиотеки:
#include <GyverHTU21D.h> 
GyverHTU21D htu;

void setup() {
Serial.begin(9600);
if (!htu.begin()) Serial.println(F("HTU21D error"));
}

void loop() {
// Читаем температуру
htu.requestTemperature(); // Запрашиваем преобразование
delay(100); // Ждем окончания (см. доку)
if (htu.readTemperature()) { // Читаем температуру из датчика и проверяем
Serial.print("Temp: ");
Serial.print(htu.getTemperature()); // В случае успеха выводим температуру в порт
Serial.println(" *C");
}

// Читаем влажность
htu.requestHumidity(); // Запрашиваем преобразование
delay(100); // Ждем окончания (см. доку)
if (htu.readHumidity()) { // Читаем влажность из датчика и проверяем
Serial.print("Hum: ");
Serial.print(htu.getHumidity()); // В случае успеха выводим влажность в порт
Serial.println(" %");
}

Serial.println();
delay(1000);
}


А вот второй, тоже оттуда:
// чтение, блокирующий вариант 

#include <GyverHTU21D.h>
GyverHTU21D htu;

void setup() {
Serial.begin(9600);
if (!htu.begin()) Serial.println(F("HTU21D error"));
}

void loop() {
// время выполнения зависит от разрешения, см. доку
float temp = htu.getTemperatureWait();
float hum = htu.getHumidityWait();
Serial.print("Temp: ");
Serial.print(temp);
Serial.println(" *C");
Serial.print("Hum: ");
Serial.print(hum);
Serial.println(" %");
Serial.println();
delay(1000);
}


#уроки
#железки
#avrки (с еспшками тоже работает)
П.С. Это сообщение очень похоже на урок про bmp280, потому что часть текста взял оттуда и переделал. Так быстрее получается
П.П.С. А за это время было много интересного, съездили на турбазу, чинил компьютер*, дискеты и жёсткий диск(всё, кроме жёсткого диска и одной дискеты из трёх ожило), собрал передатчик на не555(скоро расскажу и покажу), ловил АМ станции и сделал из еспшки флешку
*В чём была проблема - не понял. Вытыкнул всё, кроме диска ц - работает. Вернул - работает. Мистика. Может контакт плохой был, хотя зависала заставка материнской платы и всё циклически перезагружалось. До виндовса не доходило (наверно. Может просто заставку показать не успевал)
This media is not supported in your browser
VIEW IN TELEGRAM
Жёсткий диск отказался чиниться, пришлось его разобрать. Оказалось, что там сломалась магнитная головка. И тут я вспомнил про поделку Гайвера: динамик из жёсткого диска. Только была проблема. Слишком короткие и тонкие провода от катушки. Они порвались, пришлось паяться к гипертонкому лакированному медному проводу. Однако получилось, зачистил канцелярским ножом. Диск wd15earx, на 1.5 тб. У катушки сопротивление получилось 10 ом. Усилитель взял на lm386. Поёт тихо, но поёт! Провода получились жёсткие, движения катушки не видно, но в видео Гайвер сказал, что так даже лучше
П. С. Из проблем только провод был
П. П. С. Видео Гайвера: https://youtu.be/PtfTgcKS1-s?si=jE7KiiUbjRLaj85E
#поделки
С днём программиста, товарисчи
Внимание, товарисчи, вопрос. Решил себе к икспишке и одиннадцатке поставить десятку. Втыкаю установочный диск, жду, а там вот такие артефакты. Достаю видеокарту (nvidia geforce 210), на встроенной всё хорошо. При этом и икспишка, и одиннадцатка и там, и там чувствуют себя нормально. Поставил драйвера. Картинка (не сигнал!) исчезает после загрузки (вот покрутилось колёсико, а потом ничего нет). Пробовал и в вга втыкать, и в хдми. Не помогает. В принципе и на встроенной хорошо, десятка в спокойном режиме ест 1-2% ЦП, но хотелось бы с видеокартой. А теперь сам вопрос: это можно починить?
Продолжение истории. В комментариях посоветовали новую видеокарту. Но.. Какую лучше брать? Большие мне физически в корпус не влезут, там ещё жёсткие диски лежат. Ещё хотелось бы с vga. Думаю про nvidia geforce 710. В игры не играю, просто чтоб картинку на мониторе рисовать. Встроенной не хватает визуал студии. А то не хочется потратить 5 килорублей и получить те же артефакты

П. С. Материнка m2npv-vm. На картинке nvidia geforce 210, не работает с 10, с хр и 11 работает
И конец истории. Заменили конденсаторы и процессор, включаю — не работает. Оказалось, что была плохо вставлена оперативная память. Запустилось. А ещё оказалось, что видеокарта стала нормально работать. Теперь и производительность ×3, и визуал студия работает
meteostation.ino
5.7 KB
А сейчас вы узнаете, как собрать что-то похожее на метеостанцию. 1.Понадобится:
1)Олед дисплей 128*64
2)DS3231
3)BME/BMP280
2. Подключение
Подключается всё в I2C:
SCL---A5(для нанки)
SDA---A4(для нанки)
DS3231 и дисплей питаются от 5В, bme зависит от модуля, bmp от 3,3
3. Что происходит внутри
Сразу после прошивки ардуина настраивает время на время компиляции. Потом раз в 30с обновляется давление и температура, раз в 30 минут данные обрабатываются, и обновляется вероятность дождя, а каждые 0,5с перерисовывается картинка на дисплей.
#поделки
П.С. Эта штука у меня включена уже несколько месяцев, работает нормально. Но летом дождь мог начаться и при 30%, так что показания не сильно точные, но нормальные