Rankle
17.Апрель.2025 16:05:00
1
Добрый день. Впервые столкнулся с такой проблемой. Была Arduino Pro mini + энкодер + OLED SSD1306 + кольцо WS2812. Начало скетча:
#include <CtrlEnc.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3c
#define LED_COUNT 24
#define LED_PIN 7
Adafruit_NeoPixel WS2812B(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
дальше приводить скетч смысла нет. Всё работало.
Подключил вместо Arduino Pro mini - Arduino Nano. Получилось Arduino Nano + энкодер + OLED SSD1306 + кольцо WS2812. Результат - не видит OLED.
void setup()
{
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{ Serial.println(F("SSD1306 allocation failed")); for(;;); }
...
...
}
В Serial Monitor - SSD1306 allocation failed.
Но стоит закомментировать строку WS2812B - всё снова работает. Но только без функционала WS2812B.
#include <CtrlEnc.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3c
#define LED_COUNT 24
#define LED_PIN 7
//Adafruit_NeoPixel WS2812B(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
И там и там Atmel ATmega328. Параметры в Arduino IDE одинаковые. Почему так происходит? Искать другую библиотеку для WS2812?
А разве в промини не ATmega168? Точно?
неопиксел совершенно по-разному компилируется в зависимости от частоты процессора. На ПроМини всегда было 8МГц, а на Нано - 16МГц.
Это может иметь важное значение.
Еще вариант: Попробуй собрать не на 800КГц, на на 400, тоже другой блок кода компилируется.
Rankle
17.Апрель.2025 17:13:26
7
Я смотрел в микроскоп. По моему не наврали. Было написано 328. Завтра ещё раз гляну.
Rankle
17.Апрель.2025 17:14:40
8
WladDrakula:
неопиксел совершенно по-разному компилируется в зависимости от честоты процессора. На ПроМини всегда было 8МГц, а на Нано - 16МГц.
Это может иметь важное значение.
Еще вариант: Попробуй собрать не на 800КГц, на на 400, тоже другой блок кода компилируется.
А вот это уже полезный совет в отличии от спирта и огурцов. Завтра на работе попробую.
На трехвольтовых промини 8МГц. Пятивольтовые такие же, как и наны.
v258
17.Апрель.2025 17:22:09
10
И там, и там бывает и то, и другое ))
С чего бы всегда? Вполне себе промини на 16 МГц продаются. И как бэ в основном такие, на 8, как выше указали, трехвольтовые ))
Садман выше уже написал. Я забыл, что на 8 только 3 вольтовые.
Всяко бывает.
Равно как и в Нано.
MMM
17.Апрель.2025 22:10:22
13
Судя по всему, запаса оперативки практически нет. Чуть другие опции сборки - и памяти под буфер дисплея уже не хватает.
1 лайк
nik182
18.Апрель.2025 07:17:47
14
Так по паспорту у 328 на 3х вольтах 16МГц не гарантируют.
Green1
18.Апрель.2025 07:38:40
15
Тогда нужно брать LGBT. Они 16 тянут во всём диапазоне.
Rankle
18.Апрель.2025 08:11:25
17
Поясните пожалуйста что это?
Rankle
18.Апрель.2025 08:13:33
18
Бинго! Выкинул всё. Оставил по минимуму. (пример) Всё заработало. Правда взял другую библиотеку. Даааа, ОЗУ, ОЗУ, ОЗУ …
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <iarduino_NeoPixel.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SCREEN_ADDRESS 0x3c
#define LED_COUNT 24
#define LED_PIN 7
iarduino_NeoPixel WS2812B(7,24);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup()
{
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 - Error")); }
else { Serial.println(F("SSD1306 - ОК")); }
display.display();
display.clearDisplay();
delay(1000);
WS2812B.begin();
if(WS2812B.begin()) {Serial.println("WS2812B - Ok");} // Инициируем работу со светодиодами и выводим сообщение об успешной инициализации
else {Serial.println("WS2812B - Error");}
WS2812B.setColor(NeoPixelAll, 255,0,0); // Устанавливаем красный цвет для всех светодиодов (все,R,G,B)
WS2812B.write(); // Записываем
delay(1000);
}
void loop ()
{
}
MMM
18.Апрель.2025 08:23:46
20
Rankle:
Всё заработало.
где в таком случае моя отметка за решение вопроса?
1 лайк
Rankle
18.Апрель.2025 08:38:37
21
Без проблем Где её поставить?