Магический вентилятор
Вентилятор, который может удивить!
Ссылка на ВК видео
Вентилятор, который может удивить!
Ссылка на ВК видео
Наконец-то я написал полноценный онлайн‑конвертер GIF анимаций для черно-белых дисплеев, который позволяет всего за несколько кликов превратить обычную GIF‑ку в готовый заголовочный файл C/C++. И использовать его в своем проекте. Никаких сложных программ и ручной обработки — всё делается прямо в браузере.
если открыть Servo.cpp там есть DEFAULT_PULSE_WIDTH
Servo::Servo()
{
if( ServoCount < MAX_SERVOS) {
this->servoIndex = ServoCount++;
servos[this->servoIndex].ticks = usToTicks(DEFAULT_PULSE_WIDTH);
}
else
this->servoIndex = INVALID_SERVO ; // too many servos
}
вот можно ли туда, вместо DEFAULT_PULSE_WIDTH, что-то добавить отсюда :
int Servo::read() // return the value as degrees
{
return map( this->readMicroseconds()+1, SERVO_MIN(), SERVO_MAX(), 0, 180);
}
int Servo::readMicroseconds()
{
unsigned int pulsewidth;
if( this->servoIndex != INVALID_SERVO )
pulsewidth = ticksToUs(servos[this->servoIndex].ticks) + TRIM_DURATION ; // 12 aug 2009
else
pulsewidth = 0;
return pulsewidth;
}
чтобы при инициализации пина сервопривод вставал не в дефолтное значение, а в считанное с текущего положения?
я просто не особо разбираюсь в программировании, и читаю только мануалы по командам в библиотеках, ну и по примерам из интернета.
находил какие-то древние вопросы на форумах, там советовали подключать транзистор на питание сервопривода, типа после прохождения всех attach в Setup, открывать транзистор. но без питания с сервопривода невозможно считать положение. сервопривод китайский, на 3 провода: плюс минус и управление.
если я не ошибаюсь, то можно создать переменную в начале Servo.cpp которая будет содержать данные о положении, но чё то не пойму пока как))
В области программирования и электроники даже самые простые задачи порой требуют немалых усилий, особенно когда дело касается создания визуальных эффектов. Одним из таких эффектов является "эффект Матрицы" — падающие строки зеленых символов, ставшие символом одноименного фильма. Я решил создать этот эффект на и микроконтроллере ESP32 C3 и светодиодной матрице 8x8 с светодиодами WS2812. Однако на практике задача оказалась гораздо более сложной, чем я предполагал. В этой статье я поделюсь своим опытом и расскажу, как ChatGPT помог мне справиться с этой задачей.
На первом этапе я решил исследовать доступные решения в интернете. Я изучил множество форумов и ресурсов, но, к своему удивлению, так и не нашел ничего подходящего. Оказалось, что реализация "эффекта Матрицы" на светодиодной матрице не так распространена, как я думал. Это заставило меня принять решение написать код с нуля.
Чтобы избежать долгих часов написания кода, я решил попробовать ChatGPT. и подробно описал свою задачу: мне нужно создать анимацию падающих пикселей, имитирующую "эффект Матрицы". ChatGPT предложил использовать библиотеку FastLED для управления светодиодами и генерации случайных пикселей, которые будут "падать" вниз.
В начале мои попытки не увенчались успехом. Либо код не работал, либо эффект сильно отличался от задуманного. То пиксели двигались слишком однообразно, то анимация выглядела неестественно. Каждый раз мне приходилось вносить правки и корректировать код, чтобы приблизиться к желаемому результату.
После множества попыток и доработок я наконец нашел оптимальный вариант кода и адаптировал его под свои нужды. В результате мне удалось создать эффект, который напоминал знаменитые падающие строки из "Матрицы". Пиксели плавно перемещаются сверху вниз, создавая иллюзию бесконечного потока данных. Результаты своей работы я запечатлел в видео, которое прикрепил к статье.
К сожалению редактор Пикабу не позволяет корректно выложить код. По этой причине выкладываю ссылку на него.
Этот опыт научил меня, что даже с помощью современных инструментов, таких как ChatGPT, создание уникальных визуальных эффектов требует времени и терпения. Несмотря на то, что ChatGPT предоставил отличную основу для кода, мне все равно пришлось его адаптировать и дорабатывать, чтобы достичь желаемого результата. Тем не менее, использование ИИ значительно ускорило процесс разработки и помогло мне справиться с задачей, которая изначально казалась непростой.
В заключение — это проект, будет интересен как новичкам, так и опытным разработчикам. Если у вас есть доступ к таким инструментам, как ChatGPT, не бойтесь экспериментировать и пробовать новое!
У меня никогда нет с собой наличных денег и тем более металлических монет. А для того, что бы получить заветную тележку в супермаркете, требуется монета 10 руб. Вообщем я эту проблему решил при помощи 3D принтера.
Скачать 3D модель отмычки можно у меня в блоге: https://duino.ru/blog/otmichka/
Если нет 3D принтера, то можно ее вырезать из куска пластика от канистры.
Мир DIY-электроники и микроконтроллеров постоянно развивается, и новые устройства появляются на рынке с завидной регулярностью. Arduino Nano долгое время был фаворитом среди энтузиастов, однако с появлением ESP32-C3 Super Mini многие задаются вопросом: не является ли он убийцей Arduino? В этой статье мы проведем подробное сравнение этих двух устройств и рассмотрим их достоинства и недостатки.
Arduino Nano:
Процессор: ATmega328P
Частота: 16 МГц
Память: 32KB Flash, 2KB SRAM, 1KB EEPROM
Порты ввода/вывода: 14 цифровых, 8 аналоговых
Коммуникации: UART, SPI, I2C
Напряжение питания: 5V
Размер: 45x18 мм
ESP32-C3 SuperMini:
Процессор: 32-битный RISC-V ядро
Частота: 160 МГц
Память: 400KB SRAM, 4MB Flash
Порты ввода/вывода: 22 цифровых, 6 аналоговых
Коммуникации: UART, SPI, I2C, I2S, BLE, Wi-Fi
Напряжение питания: 3.3V
Размер: 22x18 мм
ESP32-C3 SuperMini значительно превосходит Arduino Nano по производительности. Его 32-битный RISC-V процессор с частотой 160 МГц многократно мощнее 8-битного ATmega328P с частотой 16 МГц. Оперативная память ESP32-C3 также в разы больше: 400KB против 2KB у Arduino Nano, что позволяет обрабатывать более сложные задачи и хранить больше данных. Flash память ESP32 C3 так же многократно превосходит Flash память Ардуино Нано, 4МБ против 32КБ
ESP32-C3 Super Mini поддерживает UART, SPI и I2C, как и Arduino Nano, но у него также имеет встроенные модули Wi-Fi и BLE (Bluetooth Low Energy). Это открывает огромные возможности для IoT-проектов, позволяя легко коннектиться с интернетом и другими устройствами.
ESP32-C3 Super Mini имеет размеры 22x18 мм, что делает его более компактным, чем Arduino Nano (45x18 мм). Это особенно важно для проектов, где экономия места критична.
Arduino Nano работает от 5В, в то время как ESP32-C3 требует 3.3 В. Но для многих современных сенсоров, дисплеев и других периферийных устройств 3.3В является стандартом.
Одним из ключевых преимуществ ESP32-C3 Super Mini является его режим глубокого сна. В этом режиме микроконтроллер потребляет всего несколько микроампер (обычно около 5 мкА), что позволяет значительно экономить заряд батареи. Это делает его идеальным выбором для проектов, которые должны работать автономно в течение длительного времени, таких как датчики, умные устройства и другие IoT-решения.
Допустим, у вас есть проект с датчиком температуры, который должен передавать данные один раз в 10 минут. В режиме глубокого сна ESP32-C3 Super Mini будет просыпаться только для сбора и передачи данных, а остальное время находиться в режиме минимального энергопотребления. Это позволяет устройству работать от небольшой батарейки типа CR2032 в течение нескольких месяцев.
Обе платформы поддерживаются Arduino IDE, что облегчает переход с Arduino Nano на ESP32C3. Однако ESP32-C3 также поддерживает другие среды разработки, такие как PlatformIO и ESP-IDF, что может быть полезно для более сложных проектов.
ESP32-C3 Super Mini действительно обладает всеми характеристиками, чтобы стать убийцей Arduino Nano. Он предлагает значительно лучшую производительность, больше памяти и встроенные модули для беспроводной связи, при этом оставаясь компактным и удобным в использовании. Так же без сомнений большое значение имеет режим глубокого сна и возможность многомесячной работы от одной маленькой батарейки типа CR2032.
Если вы ищете не дорогое, но более мощное и универсальное решение для своих проектов, ESP32-C3 Super Mini — это отличный выбор, который открывает новые возможности для творчества и инноваций.
В начале поста опечатка в описании портов ESP32C3
Так как пост отредактировать нельзя вношу изменения здесь:
Количество выведенных на плате GPIO: 13
GPIO с поддержкой RTC: 0, 1, 3, 4, 5
GPIO подтянутые внешними резисторами 10К к 3,3В: 2, 8, 9
Системный индикатор подключен: GPIO 8
Кнопка BOOT: GPIO 9
Разобрал фонарик с УФ светодиодами. Из светодиодов спаял матрицу 3х7. Все светодиоды подключил параллельно. Ограничил ток светодиодов резистором 15 Ом. К матрице припаял USB кабель и подключил адаптеру от телефона 5В.
Теперь они всегда светятся.
Ребята помогите плиз. Есть скетч на Ардуино. Заключается в следующем: есть дальномер us100 работающий по uart. Но при включении питания он не показывает верные данные (расстояние), если расстояние от стены до датчика больше 30 см.
Его ребутить на кнопку reset нужно, чтобы он показывал верные значения, либо чтобы расстояние перед ним было меньше 30 см.
Как сделать одну перезагрузку при включении питания? У меня либо зацикливается и перезагружается постоянно, либо не работает совсем перезагрузка (((
Спасибо всем заранее !
Выкладываю код:
#include <SoftwareSerial.h>
#include <U8g2lib.h>
#define RX_PIN 2
#define TX_PIN 3
#define RX_PIN_2 7
#define TX_PIN_2 6
#define LED_RED_PIN 9
#define LED_GREEN_PIN 10
#define LED_BLUE_PIN 11
U8G2_SSD1306_128X64_NONAME_F_HW_I2C display(U8G2_R0);
int distance = 0;
int initial_distance = 0;
SoftwareSerial us100(RX_PIN, TX_PIN);
void setup() {
Serial.begin(9600);
us100.begin(9600);
pinMode(LED_RED_PIN, OUTPUT);
pinMode(LED_GREEN_PIN, OUTPUT);
pinMode(LED_BLUE_PIN, OUTPUT);
display.begin();
display.clearBuffer();
display.setFont(u8g2_font_ncenB08_tr);
display.setCursor(0, 10);
display.print("Distance:");
display.sendBuffer();
}
void loop() {
delay(100);
us100.write(0x55);
delay(50);
while (us100.available() < 2) {}
byte highByte = us100.read();
byte lowByte = us100.read();
int inches = highByte * 256 + lowByte;
if (initial_distance == 0) {
initial_distance = inches;
}
distance = inches - initial_distance;
display.clearBuffer();
display.setCursor(0, 30);
display.print(distance);
display.sendBuffer();
if (distance >= -500) {
analogWrite(LED_RED_PIN, 255); // включаем красный цвет
analogWrite(LED_GREEN_PIN, 0); // выключаем зеленый цвет
analogWrite(LED_BLUE_PIN, 0); // выключаем синий цвет
} else {
analogWrite(LED_RED_PIN, 0); // выключаем красный цвет
analogWrite(LED_GREEN_PIN, 255); // включаем зеленый цвет
analogWrite(LED_BLUE_PIN, 0); // выключаем синий цвет
}
Serial.write(highByte);
Serial.write(lowByte);
}
