Мечта любого мальчика старше 30 лет) Газонокосилка на радио управлении
Приборка на RC-грузовике или полурукописный скетч
История всему этому такова: 30-летний мальчик понял, что может играть с модельками и радоваться жизни. И вот в его жизни появляется радиоуправляемый грузовик!
Я не буду рассказывать, что и у кого я покупал, я думаю, на меня и так выльют ушат помоев с моим подходом и заодно научат, как надо. Я просто хочу поделиться тем, что с большим трудом за полгода наконец-то родил скетч для Arduino с экраном, чтобы превратить его в приборку для грузовика. Да, никто не увидит, но я буду знать, что оно там есть. На этом все. Спасибо за внимание. Если нужен скетч, то он лежит тут.
P. S. Я хотел использовать ESP8266, но там совсем не получилось. Я не уверен, что оно будет корректно работать. Если решите меня ткнуть носом в мои ошибки, буду благодарен. Есть решение от Тамии, но 14 тысяч прям жаба душит на модель, которая была сама собрана за 10 тысяч. В скрипте реализовано то, что скорость и коробку он считывает из начального состояния при включении.
*значение нейтрали скачет из-за того что я использую крутилку без фиксации
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>// можно добавить 2 слеша чтобы выключить
// Определяем размеры экрана
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32 //я использую 0.91 oled
// Создаём объект для OLED дисплея
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Определяем пины для DHT и создаем объект DHT
#define DHTPIN 2 // можно добавить 2 слеша чтобы выключить
#define DHTTYPE DHT11 // можно добавить 2 слеша чтобы выключить
DHT dht(DHTPIN, DHTTYPE); // можно добавить 2 слеша чтобы выключить
// Пин для считывания ШИМ-сигнала
const int speedPin = A3; //пин на arduino
// Переменные для начального значения и текущей скорости
float initialPwmValue = 0;
float currentSpeed = 0;
bool isInitialValueSet = false;
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C, -1);
dht.begin();// можно добавить 2 слеша чтобы выключить
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Выводим стартовое сообщение
display.setCursor(30, 0);
display.println("ZiL Dash Load"); // можно писать все чтот угодно
display.setCursor(0, 15);
display.println("Status CHECK! EBU_ok. err_14. START"); // можно писать все чтот угодно
display.display();
delay(5000); // можно менять в соответствии сколько вы хотите видеть этот экран
display.clearDisplay();
}
void loop() {
// Считывание ШИМ-сигнала
int pwmValue = pulseIn(speedPin, HIGH); // Считываем время импульса
float dutyCycle = map(pwmValue, 0, 10000, 0, 800); // Преобразуем в значения от 0 до 255
float speed = dutyCycle * (180.0 / 800.0); // максимальная скорость 88кмч подбирайте значения для себя
// Преобразование значения ШИМ в скорость (примерно 0-100 км/ч)
currentSpeed = dutyCycle * (180.0 / 100.0);
// Установим начальное значение ШИМ при первой итерации
if (!isInitialValueSet) {
initialPwmValue = dutyCycle;
isInitialValueSet = true;
}
// Вычисляем относительную скорость относительно начального значенияfloat relativeSpeed = dutyCycle - initialPwmValue;
if (relativeSpeed < 0) {
relativeSpeed = 0;
}
if (relativeSpeed < 0) { relativeSpeed = 0; //
}
// Очистка дисплея и вывод текущего состояния
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
// Сравниваем текущее значение с начальным и выводим соответствующие букву для симуляции акпп
if (dutyCycle < initialPwmValue) {
display.setTextColor(SSD1306_WHITE);
display.println("R");
display.setTextColor(SSD1306_BLACK);
display.setCursor(5, 0);
display.print("N");
display.setCursor(10, 0);
display.print("D");
} else if (dutyCycle == initialPwmValue) {
display.setTextColor(SSD1306_BLACK);
display.setCursor(5, 0);
display.print("R");
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.print("N");
display.setTextColor(SSD1306_BLACK);
display.setCursor(15, 0);
display.print("D");
} else {
display.setTextColor(SSD1306_BLACK);
display.setCursor(5, 0);
display.print("R");
display.setCursor(10, 0);
display.print("N");
display.setTextColor(SSD1306_WHITE);
display.setCursor(15, 0);
display.print("D");
}
// Считывание температуры
float t = dht.readTemperature(); // Считываем температуру в Цельсиях// можно добавить 2 слеша чтобы выключить
float h = dht.readHumidity(); // Чтение влажности, // можно добавить 2 слеша чтобы выключить
if (isnan(h) || isnan(t)) {// можно добавить 2 слеша чтобы выключить
Serial.println("chek!");// можно добавить 2 слеша чтобы выключить
return;
}
// Отображаем температуру на дисплее
display.setTextColor(SSD1306_WHITE);
display.setCursor(30, 0); //положения по горизонтали и вертикали
display.println("URAL/Zil Dash");
display.setCursor(0, 10);// можно добавить 2 слеша чтобы выключить
display.print("T:");// можно добавить 2 слеша чтобы выключить
display.print(t);// можно добавить 2 слеша чтобы выключить
display.println("C");// можно добавить 2 слеша чтобы выключить
display.setCursor(60, 10);// можно добавить 2 слеша чтобы выключить
display.print("H: ");// можно добавить 2 слеша чтобы выключить
display.print(h);// можно добавить 2 слеша чтобы выключить
display.println(" %");// можно добавить 2 слеша чтобы выключить
display.setCursor(15, 20);
display.print("Speed: ");
display.print(currentSpeed - (initialPwmValue * (180.0 / 100.0)));
display.println(" km/h"); //если поменять на мили ничего не поменяется
display.display(); // Обновление дисплея
delay(10); // частота обновление данных
display.clearDisplay(); // Очищаем экран для перерисовки
}
Не судите строго, всем хорошего дня!
В оптимизации скетча помогала мне нейронка от "нереклама"
Радиоуправляемые жигули, идет сразу в тонировке в круг
Подойдет в качестве подарка, ведь многие из нас начинали с этого авто. Отзывы положительные.
Нашел на Али и аналог на Яндекс Маркет