Oled 0.96 inch и сервопривод не работают вместе

Oled 0.96 inch на чипе SSD 1315. Сервопривод обычный, на 5V. Делаю проект где форточка открывается автоматически при достижении максимальной температуры и закрывается при достижении минимальной. Есть кнопки, сервопривод, термистор, OLED экран и Arduino uno.

#include "OLED_Driver.h"
#include "GUI_paint.h"
#include "DEV_Config.h"
#include "Debug.h"
#include "ImageData.h"
#include <math.h>  // Для log()

#include <Servo.h>

Servo myServo;

bool isOpened = false;

const int B = 4275000;  // Коэффициент B термистора
const int R0 = 100000;  // Номинальное сопротивление термистора
const int pinTempSensor = A0;  // Датчик температуры на A0
UBYTE *BlackImage;

const int buttonPins[] = {2, 3, 4, 5};  // Пины кнопок
const int buttonCount = 4;  // Количество кнопок

int highTemperature = 20;  // Стартовые значения
int lowTemperature = 10;
float lastTemperature = -1000; // Предыдущее значение температуры

unsigned long lastPressTime = 0;  // Для задержки удержания кнопки
const int buttonDelay = 300;  // Задержка в миллисекундах


void setup() {
    Serial.begin(9600);  
    System_Init();
    myServo.attach(9);
    
    Serial.println(F("OLED_Init()..."));
    OLED_0in96_Init();
    Driver_Delay_ms(500);
    OLED_0in96_clear();

    for (int i = 0; i < buttonCount; i++) {
        pinMode(buttonPins[i], INPUT_PULLUP);
    }

    // Создаём буфер изображения
    UWORD Imagesize = ((OLED_0in96_WIDTH % 8 == 0) ? (OLED_0in96_WIDTH / 8) : (OLED_0in96_WIDTH / 8 + 1)) * OLED_0in96_HEIGHT;
    BlackImage = (UBYTE *)malloc(Imagesize);

    if (BlackImage == NULL) {
        Serial.println("Ошибка выделения памяти!");
        return;
    }

    Serial.println("Создаём изображение...");
    Paint_NewImage(BlackImage, OLED_0in96_WIDTH, OLED_0in96_HEIGHT, 90, BLACK);
    Paint_SelectImage(BlackImage);
    Paint_Clear(BLACK);
}

void updateScreen() {
    // Очищаем только часть экрана под текст
    Paint_DrawRectangle(30, 20, 128, 60, BLACK, DOT_PIXEL_1X1, DRAW_FILL_FULL);

    // Отображение температуры
    Paint_DrawString_EN(0, 1, "Temperature", &Font16, WHITE, WHITE);
    
    char buffer[10];
    dtostrf(lastTemperature, 4, 1, buffer);
    Paint_DrawString_EN(33, 20, buffer, &Font24, WHITE, WHITE);
    
    // Отображение границ температур
    char highBuf[10], lowBuf[10];
    dtostrf(highTemperature, 3, 0, highBuf);
    dtostrf(lowTemperature, 3, 0, lowBuf);
    
    Paint_DrawString_EN(0, 45, "Max:", &Font16, WHITE, WHITE);
    Paint_DrawString_EN(27, 45, highBuf, &Font16, WHITE, WHITE);
    
    Paint_DrawString_EN(60, 45, "Min:", &Font16, WHITE, WHITE);
    Paint_DrawString_EN(87, 45, lowBuf, &Font16, WHITE, WHITE);

    OLED_0in96_display(BlackImage);
}

unsigned long lastScreenUpdate = 0;
const int screenUpdateInterval = 1000; // Интервал обновления экрана (1 секунда)

void loop() {
    unsigned long currentTime = millis();

    // Читаем температуру с датчика
    int a = analogRead(pinTempSensor);
    float R = 1023.0 / a - 1.0;
    R = R0 * R;
    float T = 1.0 / (log(R / R0) / B + 1 / 298.15) - 273.15;

    // Проверяем, нужно ли обновить экран (раз в 1 секунду)
    if (currentTime - lastScreenUpdate > screenUpdateInterval) {
        lastScreenUpdate = currentTime;
        updateScreen();
    }

    // Проверяем кнопки
    for (int i = 0; i < buttonCount; i++) {
        if (digitalRead(buttonPins[i]) == LOW && (currentTime - lastPressTime > buttonDelay)) {
            lastPressTime = currentTime;  // Запоминаем время нажатия
            switch (i + 1) {
                case 1:
                    highTemperature++;
                    Serial.println("Повышение максимальной температуры");
                    break;
                case 2:
                    highTemperature--;
                    Serial.println("Понижение максимальной температуры");
                    break;
                case 3:
                    lowTemperature++;
                    Serial.println("Повышение минимальной температуры");
                    break;
                case 4:
                    lowTemperature--;
                    Serial.println("Понижение минимальной температуры");
                    break;
            }
            updateScreen();  // Обновляем экран при изменении параметров
        }
    }
    // Управление сервоприводом
    if (T > highTemperature && !isOpened) {
        Serial.println("Открыть");
        myServo.attach(9);
        myServo.write(5);
        delay(100);
        myServo.detach();
        isOpened = true;
    } 
    else if (T < lowTemperature && isOpened) {
        Serial.println("Закрыть");
        myServo.attach(9);
        myServo.write(0);
        delay(100);
        myServo.detach();
        isOpened = false;
    }

    delay(100);  // Короткая задержка для плавности работы
}

Если загрузить код прямо так, то будет работать двигатель, термомистр, кнопки, но экран будет показывать кашу. Если убрать код с сервоприводом, то каша с экрана пропадает.
Я пытался переставлять код с сервоприводом, объявлять его только в самой функции “if”. ничего из этого не сработало

Схема?

1 лайк

Если с указанным выше кодом, отключить все провода от сервопривода, то экран работает нормально, или все равно каша?

Напишу без питания и земли. Серво подключен к 9 PWM, кнопки к 2, 3, 4, 5 PWM, термистор к А1. Экран подключен так: DIN – 11, CLK – 13, CS – 10, DC – 7, RES – 8.

нет, все еще каша

  1. Схемы не пишут, а рисуют;
  2. Рисуют их с питанием и с землёй. В т.ч. с указанием, какие именно источники питания используются

пожалуйста посоветуйте программы для создания схем

Если прям по ЕСКД, то SPlan, если так, чтобы понятно было – любой эмулятор электронных схем, там Proteus, LTSpice, …

1 лайк

Splan, EasyEDA, онлайн редакторы…,

Для создания принципиальных схем существует множество программ, как платных,
так и бесплатных. Вот список популярных инструментов:


Профессиональные программы (платные)

  1. Altium Designer
  • Одна из самых мощных программ для проектирования схем и печатных плат.
  • Подходит для профессионального использования.
  • Высокая стоимость, но широкий функционал.
  1. OrCAD
  • Популярный инструмент для проектирования электронных схем.
  • Включает модули для симуляции и анализа схем.
  • Используется в промышленности.
  1. KiCad (бесплатная, но с профессиональным уровнем)
  • Бесплатная программа с открытым исходным кодом.
  • Подходит для создания сложных схем и печатных плат.
  • Активно развивается и поддерживается сообществом.
  1. Eagle (Autodesk)
  • Популярная программа для проектирования схем и печатных плат.
  • Есть бесплатная версия с ограничениями.
  • Интеграция с другими продуктами Autodesk.
  1. Proteus
  • Программа для проектирования схем и симуляции их работы.
  • Подходит для обучения и профессионального использования.
  • Включает виртуальные инструменты для тестирования.

Бесплатные программы

  1. Fritzing
  • Простая программа для начинающих.
  • Удобна для создания схем и прототипирования.
  • Подходит для образовательных целей.
  1. EasyEDA
  • Онлайн-платформа для проектирования схем и печатных плат.
  • Бесплатная версия с базовым функционалом.
  • Интеграция с JLCPCB для заказа печатных плат.
  1. Tina-TI
  • Бесплатная программа для моделирования и проектирования схем.
  • Подходит для анализа и тестирования схем.
  • Разработана Texas Instruments.
  1. LTspice
  • Бесплатная программа для моделирования аналоговых схем.
  • Разработана Analog Devices (ранее Linear Technology).
  • Подходит для симуляции и анализа.
  1. Qucs-S
  • Бесплатная программа с открытым исходным кодом.
  • Подходит для моделирования и анализа схем.
  • Поддерживает различные типы симуляций.

Онлайн-инструменты

  1. CircuitLab
  • Онлайн-редактор схем с возможностью симуляции.
  • Удобен для быстрого создания и тестирования схем.
  • Есть бесплатная и платная версии.
  1. Scheme-it (от Digi-Key)
  • Бесплатный онлайн-инструмент для создания схем.
  • Подходит для простых проектов.
  • Интеграция с библиотекой компонентов Digi-Key.

Для начинающих и образовательных целей

  1. Tinkercad (от Autodesk)
  • Онлайн-платформа для создания простых схем и 3D-моделей.
  • Подходит для обучения и прототипирования.
  • Бесплатная.
  1. EveryCircuit
  • Программа для моделирования и визуализации работы схем.
  • Доступна как приложение для Android/iOS и онлайн.
  • Подходит для обучения.

Выбор программы зависит от ваших задач, уровня опыта и бюджета. Если вы только начинаете, попробуйте Fritzing, EasyEDA или Tinkercad. Для профессионального использования рассмотрите Altium Designer, KiCad или OrCAD.

Вот это тебя «шторкнуло» :joy:

не меня :rofl:
странно что про SPlan ни слова)

Потому что ГОСТовский, видимо…

Кстати, даже на планшете относительно удобно рисовать онлайн:

Я сейчас попробовал, простые схемы вообще легко и интуитивно понятно )

неаккуратненько как-то

точно целое? :slight_smile:

думаю это память. Динамический буфер экрана на Уно - это уже “звоночек”. А вы еще там какие-то заставки и менюшки создаете, насколько я понял.

Скетч использует 22668 байт (70%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 900 байт (43%) динамической памяти, оставляя 1148 байт для локальных переменных. Максимум: 2048 байт.

Эта цифра не учитывает ваш буфер:

прибавьте одно к другому, и расход памяти превысит 90%

На локальные переменные не останется места

И как это исправить? купить новый экран?

Новый контроллер.