История болезни №3. Диагноз: "Мы его теряем..."
═══════════════════════
🏥 История болезни №3
Пациент:
Инженегр-любитель
Возраст проекта:
31 день
Диагноз:
"Всё пропало"
Стадия заболевания:
Терминальная
Симптомы:
· Потеря связи с реальностью
· Везде мерещатся кубы с белыми глазами
· Заходя даже в туалет на тебя смотрит Кубобот
Назначено лечение:
Переключиться на другой проект
Пациент:
В ответ на лечение пациент спаял еще одного кубобота
═══════════════════════
🤖 Всем лимонов! 🍋🍋🍋
После долгого пути проект обрел свое, так скажем, лицо. Форма устоялась, функционал стал ясен. Всё ещё есть шероховатости, которые устраняются, но тем не менее, уже есть объект и этот объект мне нравится.
Сегодня я бы хотел больше поведать именно о техничке того, как сейчас выглядит проект кубобот01.
Корпус состоит из 3 частей: тело, задняя крышка и лицо. Лицо у всех черное. А корпуса бывают разные. В итоге после сборки кубобот остается неразборным.
В своей основе каждый кубобот это миниатюрная плата ESP32-C3. чрезвычайно миниатюрная, но достаточно мощная чтобы выдержать напор моих амбиций.
Тот самый момент, когда в погоне за терабайтами памяти на ПК сидишь, смотришь на микросхемку и думаешь: "этих 4Мб мне просто за глаза"
Мои навыки в пайке растут пропорционально развитию проекта. Если первый прототип еле умещался в кубический корпус, то сейчас там и деталей больше и еще место остается. И наконец то я начал паять не эзернетом, найденным на помойке, а нормальными монтажными проводами.
Все компоненты максимально базовые для базированного ардуинщика, упакованые в кубик со стороной 33мм.
Но я не стою на месте. Например, DHT11 с прошлого поста был заменен на D18b20, потом на DHT22, а потом на BMP280. С остальными компонентами тоже происходят изменения как в наименованиях, так и в расположении. например, кнопка переехала на крышу, вместо левой стороны. Неизменным остается только ESP32C3 и, пожалуй, OLED дисплей. Хотя и он меняется в цветах.
В программной части так же без особых откровений.
Кубобот начинался с простейшей идеи чтобы что-то моргало рядом. И код состоял из 10-20 строчек, не считая #include и #define
Кстати, программирую в Arduino IDE просто потому что привык еще со времен проекта для своей машины, в котором использовался Arduino Nano. переучиваться на ESP-IDF не вижу практического смысла
ну вот, например. Из последнего.
Нужно показывать уровень заряда аккумулятора. Если просто кинуть литиевый аккум на ногу МК он сгорит и придется покупать новый. Собираем делитель напряжения из того что валяется под ногами, методом научного тыка подбираем коэфициенты для формулы, подставляем в код и вуаля - кубобот уже реагирует на зарядку.
void ReadVoltage()
{
if(millis() - eventTimerV >= 5000)
{
float voltage = (analogRead(1)*4.2)/3200;
batteryLevel = map(analogRead(1), 0.0f, 3200.0f, 0.0f, 100.0f);
Serial.print("raw: ");
Serial.println(analogRead(1));
Serial.print("voltage: ");
Serial.println(voltage);
Serial.print("Batt percentage: ");
Serial.println(batteryLevel, 1);
eventTimerV = millis();
}
}
Почему 3200 не спрашивайте - не знаю. Просто подобрал мультиметром.
И вот на таких функциях строится вся логика кубобота.
Цикл loop содержит в себе только названия функций и соблюдает их очередность. И никаких delay(). Эта функция просто вешает МК и рушится магия происходящего.
Ладно, delay() один все таки есть. на 2 секунды. Он при включении чтобы пользователь мог прочитать один из случайных советов
void loop() {
readLDR(A0, 500); //поменяй на 500 и пин на А0 для кубика. для ЕСП32 1000 и 34 пин
//readTempdDHT();
readTempBMP();
//readTempdDallas();
ReadVoltage();
static uint32_t warntmr;
if (batteryLevel < 20) //раз в 30сек выводим пустую батарейку если заряда мало
{
if (millis() - warntmr >= 30000) {
warntmr = millis(); // сброс таймера
display.clearDisplay();
display.drawBitmap(0,0, battery_empty,128,64, 1);
display.display();
delay(2000);
}
}
ButtonListener();
Gyro();
if (StateFlag)
{
StateMonitor();
}
else
{
if (!DizzyAnim) FallAside();
DizzyGate();
if (DizzyAnim && !FallFlag) Dizzy();
if (BatteryEmote) showBat();
if(!BatteryEmote && !DizzyAnim && !FallFlag) RandAnim();
if(!BatteryEmote && !RandAnimFlag && !DizzyAnim && !FallFlag) roboEyes.update();
}
}
В конце есть монструозная конструкция с булевыми переменными. Можно упростить, но как говорил тот самый: Можно, а зачем? Памяти не ест, отрабатывает хорошо. Если есть советы - буду рад прочитать их в комментариях
Что еще можно сказать? Я почти доволен тем что получилось, и уже постепенно планирую Кубобота02. Он будет огромным, куб со стороной целых 66мм! Монструозный!
А пока я хотел бы сказать спасибо тем, кто уже поддержал проект, купив кубоботов.


Благодаря им я не забрасываю, а постоянно развиваю и совершенствую как программную, так и аппаратную часть. Как минимум, паяю уже нормальными проводами и не паяльником из фикс прайса.
На этом, пожалуй, стоит остановится.
Спасибо, что дочитали до конца! Буду рад Вашему мнению в комментариях!
Чтобы красиво завершить пост - вот вам фотография попувермы!
























































