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

Вот наш чат: https://yangx.top/arduinki_esp_chat
加入频道
Ардуинки, 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
Спецвыпуск!
У некоторых плат с еспшками стоит другой юсб-юарт преобразователь (не CH340, а CP2102). И на него нужен другой драйвер — вот ссылка на офф. сайт. Чтобы скачать, заходим туда и ищем драйвер под свою ос, потом тыкаем, а дальше всё как обычно. После установки можно подключить плату и посмотреть в диспетчере устройств, отобразилась она или нет.

#espшки
#уроки
👍3🐳1
Для всего следующего, сначала надо понять, как работает макетная плата(макетка). На первой картинке её изображение, на второй показано, как соединены контакты

#начало
#уроки
Перед тем, как будет обзор железок, надо ещё кое-что рассказать. У ардуины есть 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
А теперь коротко про вайфай в еспшках.
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шки
#уроки
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
server.ino
5.4 KB
А вот и сервер на есп. Здесь подробно объяснять не буду, в прошивке есть комментарии. Потом напишу как делать html, но если посмотреть, наверное можно продолжить по аналогии. Схема простая. Диод подключается к D4, SDA дисплея к D2, SCL к D1. До этого была кнопка, но она себя нестабильно ведёт. Поэтому вместо неё останется просто для примера отправка 1

А теперь как этим пользоваться.
1. Сначала надо включить монитор порта и поменять скорость с 9600 на 115200
2. Потом надо перезагрузить вемос. На экране будут точки, а потом появится айпи адрес
3. Его надо вбить в браузер
4. Должен появиться интерфейс
5. Всё. Можно управлять диодом и дисплеем

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

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

#уроки
#ардуиноиде
#начало
81
А сейчас вы узнаете, что такое гайверхаб и как им пользоваться.
Иногда бывает надо управлять железками удалённо, но заморачиваться с самостоятельной реализацией не хочется. Или просто надо управлять чем-то из интернета. Для этого Гайвер сделал гайверхаб.

1. Структура программы
В сетупе подключается вифи, настраивается mqtt, запускается хаб и подключается билдер:
hub.mqtt.config("test.mosquitto.org", 1883);
hub.onBuild(build);
hub.begin();
2. Билдер
В нём настраиваютя компоненты и записываются значения в переменные. Билдер обычно делают перед сетупом
void build(gh::Builder& b) {
GH_ROW(b, 1,
b.Button().size(2);
b.Button(););
}
3. Компоненты
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шки
#библиотеки
👍43
А сейчас вы узнаете про i2c дисплей 1602(или 2004) и как с ним работать.
1. Описание
Этот дисплей — самый стандартный(может и распространённый) для ардуино поделок. Он бывает 16 символов на 2 строки, 20 на 4 и других размеров. Мы будем использовать 16 на 2 и 20 на 4. Желательно брать дисплей с i2c конвертером, т.к. будет занимать всего 2 ноги
2. Прошивка
#include <LiquidCrystal_I2C.h>  // подключение 
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() {}
3. Библиотеки
Надо скачать библиотеку LiquidCrystal_I2C и всё
4. Подключение
Sda к A4
Scl к A5

П. С. На дисп нельзя просто так вывести русские буквы, надо немного схитрить. Но это уже совсем другая история

#уроки
#avrки (но дисп и с еспшками работает)
#железки
#библиотеки
5
А сейчас вы узнаете как использовать 2 ядра есп32 одновременно и зачем это + как прошить еспшку, если она не шьётся.
1. Иногда проект получается сложный криво работает. Возможно это из-за того, что не хватает частоты процессора. Поэтому отваливается вайфай и всё работает медленно. В таком случае можно использовать оба ядра (у есп32 их 2). Делается это так:
#define LED1 22 // пин диода
#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
}
}
Кстати всё изначально запускается на 1 ядре (втором. Нумерация с 0)

2. Еспшка может не прошиваться по нескольким причинам. Не тот юсб порт, нет драйверов, плохой кабель, проблемы с памятью и др.
Первые три пункта уже объяснялись на канале. А вот с памятью всё сложнее. Надо выбрать порт, открыть монитор порта, поставить скорость 115200 и нажать ресет на еспшке. В порт пришлётся много информации. Надо найти что-то типа 1)DIO/QIO/DOUT и 2)80MHz/40MHz. Потом зайти в инструменты, в flash mode поставить из 1), а в flash frequency из 2). И ещё. Чтобы прошить еспшку, надо зажать кнопку boot и кликнуть по reset. Потом можно прошивать

#espшки
#вифи
#ардуиноиде
#уроки
7
А сейчас вы узнаете, как подключить адресную ленту 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)
11🤮2👍1
А сейчас вы узнаете, что такое функции и зачем это всё.
Очень часто в прошивке много раз повторяются почти одинаковые фрагменты кода, и чтобы каждый раз всё это не писать, придумали функции. У них есть параметры, т.е. они могут получать значение. Ещё функции могут возвращать результат. Делаются они так:
<тип> <имя> (параметры [переменные, через запятую]) {
// код
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
А сейчас вы узнаете, как подключить и использовать датчик 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ки (с еспшками тоже работает)
6🫡2👍1🐳1🍓1
А сейчас вы узнаете, как подключить и использовать датчик 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(скоро расскажу и покажу), ловил АМ станции и сделал из еспшки флешку
*В чём была проблема - не понял. Вытыкнул всё, кроме диска ц - работает. Вернул - работает. Мистика. Может контакт плохой был, хотя зависала заставка материнской платы и всё циклически перезагружалось. До виндовса не доходило (наверно. Может просто заставку показать не успевал)
👍33