Залил прошивку (версию 1.7)в Ардуинку, собрали с сыном приемник который заработал сразу. Первые впечатления: цифровую часть (ардуино и дисплей) надо капитально экранировать и RDA тоже, иначе идет не хилая помеха
чувствительность хотелось бы поднять, установкой предварительного УВЧ.
А так даже очень прилично, выражаю благодарность авторам проекта!
Ребят, здравствуйте. А как сделать при включении полную очистку экрана? У меня на один экран работают два устройства: это радио и интернет радио на ESP12. Так при переключении с ESP на ардуино на экране остаются артефакты. Резет на ардуино к положительному результату не приводит, только помогает передёргивание питания. Можно ли это победить программным способом?
Скорее всего это из-за одновременного обращения к нему 2х устройств. После переключения на ардуино ESP, видимо, все еще пытается что-то передать на экран. Не знаю, какой интерфейс у экрана, но скорее всего какая-то из ног управления удерживается.
Экран подключен по I2C. SDA, SCK между устройствами переключается через к561кт3, питание подаётся от каждого устройства через диоды шоттки. Питание на устрорйства переключаются РПС45.
Проблема может и железная, но при переключении с фм радио на есп глюков не наблюдается. Можно, конечно, подпаяться к выводу reset и поставить ключ или чего-либо ещё, но не хочется колхозить. Должен же быть программный сброс или очистка буфера дисплея.
Т.е. проблема только если с ESP на ардуино? А если обратно, еще раз, то нормально?. Кондеры по питанию дисплея стоят достаточной емкости? Может при переключении напряжение просаживается и инициализация проходит до восстановления питания на дисплее? Еще, как вариант, можно убрать реле, и МК в сон уводить при переключении. Тогда "коммутационных недоразумений" точно быть не должно .
Не понимаю зачем atmega если есть esp8266? Может следующие строки на мысли наведут, правда нет уверенности u8g и u8g2 это одно и то же или нет. Использовал чтоб небыло повторной инициализации дисплея после сна esp:
//магия с дисплеем при первой и последующих загрузках
if (first_boot) {
u8g2.begin(); u8g2.clearBuffer(); // First init of the displays
} else { // Init displays after wake up
u8x8_gpio_Init(u8g2.getU8x8());
u8x8_cad_Init(u8g2.getU8x8());
u8x8_gpio_SetReset(u8g2.getU8x8(), 1);
}
//магия с дисплеем при первой и последующих загрузках
if (first_boot) {
u8g2.begin(); u8g2.clearBuffer(); // First init of the displays
} else { // Init displays after wake up
u8x8_gpio_Init(u8g2.getU8x8());
u8x8_cad_Init(u8g2.getU8x8());
u8x8_gpio_SetReset(u8g2.getU8x8(), 1);
}
Ругается, библиотека другая, команд таких не знает.
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
In file included from C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src\newchip.cpp:20:0:
C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src/RADIO.h:116:1: warning: 'typedef' was ignored in this declaration
typedef struct RADIO_INFO {
^~~~~~~
C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src/RADIO.h:127:1: warning: 'typedef' was ignored in this declaration
typedef struct AUDIO_INFO {
^~~~~~~
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
Там плавность не поменяешь. Всего у RDA5807 15 шагов регулировки громкости 0-15. И при 0 звук все-равно есть. Чтобы выключить совсем, нужно включить mute. Смотри подключенную библиотеку. Я правил под себя, при 0 громкости включал mute и сдвинул все на 1 вверх. В итоге получилось 16 шагов. Да, и при мелких наушниках регулировка слишком резкая, мне обычно хватает 2, дальше очень громко. На усилителе все нормально.
Kaa_2 здесь регулировка имеет 16 уровней и мельче ее не сделать,разве что поставить переменный резистор на выход RDA5807
Я ставил делитель на 2-х резисторах,подбирал номиналы так чтоб при максимальной громкости было как меньше искажений звука на выходе усилителя мощности с подключенными динамиками ,эти искажения смотрел осциллографом
помогите доработать скетч под RDA5807m. чтоб этот скетч, мог работать с приложением Blynk ссылка вверху на библиотеки и скетч и фото. помогите пожалуйста! мой телеграмм @tehnostark.
в tea5767 автопоиск есть а в режиме совместимости с RDA5807 -нет! смысл продолжать если мне человек пишет - зачем мне две почки. я и с одной проживу. а вторую продам!
радиоприемник как дополнение для умного дома в приложении блинк! включение по таймеру и выключение! не тотько свет включать и выключать и смотреть погоду а послушать после блютус, аналоговое радио и на диване поуправлять настройками! а в место кнопок поставить энкодер. так и просится возле oled 0.96"
Как ты думаешь, техностарче, что проще, "немношко переделать всю программу" или тебе купить TEA5767 в Китае и не насиловать нам моск и глаза твоими восклицательными знаками после каждого предложения.
Подскажите как можно масшабировать значок батарейки? Я хочу вместо режима сна отображать на дисплее состояние батареи с индикацией заряда в процентах. Но не могу сделать батарейку больше (на пол экрана).
Получается мне нужно свою картинку создать, закинуть ее в image2code и сгенерировать двоичный массив, который вставить вместо строк автора constuint8_t Bat1[] U8G_PROGMEM = { }?
А как из двоичного массива обратно в картинку переконвертировать, чтоб понять что автор написал и отмасштабировать bmp?
С масштабированием разобрался. Команда u8g.setScale2x2(); и обратная ей u8g.undoScale(); в цикле do.
Другой вопрос. Почему при изменении напряжения на лабораторнике (подключен "+" к пину VIN) от 4,2 до 3,2В показывает проценты отличные от map? При 5,2В - 100%, при 4,2В - 0%, хотя в map стандартные значения li-ion.
void readVcc()
{
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA, ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high << 8) | low;
result = 1.080 * 1023 * 1000 / result; // расчёт реального VCC
Voltage = int(result);
Voltage = map(Voltage, 3200, 4200, 0, 100);
Voltage = constrain(Voltage, 0, 100);
}
Я бы хотел от 2S питать свое устройство,ом будет это радио и при изменении в скетче Voltage = map(Voltage, 3200, 8400, 0, 100); вообще доходит при 7В до 73% и дальше хоть крути, хоть нет, а процент не растет.
Может нужна какая калибровка напряжения при прошивке или еще как?
А по схеме vin куда подключен? Пологаю что на стабилизатор? Вы напряжение для начала посмотрите какое мк измеряет.
МК измеряет что на него приходит и при напряжении более 5,5 В МК сгорает (по даташиту) соответственно чтоб на vin подать больше, плата стабилизирует вход. 1. Я бы узнал толерантность дисплея и радио к 5 вольтам 2. Если такой нет, то напряжение можно измерять аналоговым пином через резисторный делитель, настроив изначально внутреннее опорное напряжение.
Вольтметром посмотрите что между VCC и GND
Вот нашел способ достать *.hex файл проекта: http://rfanat.ru/Arduino_projekts/hex-arduino.html
Залил прошивку (версию 1.7)в Ардуинку, собрали с сыном приемник который заработал сразу. Первые впечатления: цифровую часть (ардуино и дисплей) надо капитально экранировать и RDA тоже, иначе идет не хилая помеха
чувствительность хотелось бы поднять, установкой предварительного УВЧ.
А так даже очень прилично, выражаю благодарность авторам проекта!
режима powerdown конечно не хватает для работы от АКБ. Просыпаться просто при нажатии кнопок. Тогда и помех гарантировано не будет.
Поиграйтесь для начала с регистром входа антены. 10 км от станций в бетонном здании на 5 см провод уверенно приемник ловит.
antena = 2;//это вставить после 66 строки. // 0 -отключена 1 - вход земля, 2 - вход FMIN 3 - оба источника //Это вставить в конец скеча void antena(uint8_t LNA_PORT_SEL) { LNA_PORT_SEL = constrain(LNA_PORT_SEL, 0, 3); uint16_t Reg05h = getRegister(0x05); // Считываем текущее значение Reg05h &= ~0xC0; // Сбрасываем биты ANTENA Reg05h |= LNA_PORT_SEL << 6; // Устанавливаем вход setRegister(0x05, Reg05h); } void setRegister(uint8_t reg, const uint16_t value) { Wire.beginTransmission(0x11); Wire.write(reg); Wire.write(highByte(value)); Wire.write(lowByte(value)); Wire.endTransmission(true); } uint16_t getRegister(uint8_t reg) { uint16_t result; Wire.beginTransmission(0x11); Wire.write(reg); Wire.endTransmission(false); Wire.requestFrom(0x11, 2, true); result = (uint16_t)Wire.read() << 8; result |= Wire.read(); return result; }Спасибо, но наверное так: antena(2); вместо antena = 2;
Посмотрел описание регистров по даташиту, регистр 5 вроде бы не при делах тут.
Примечания:
2 This value is SNR threshold for seeking, and the default value 1000 is about 32dB SNR.
3 0x20H_bit<14:12>, Seek_Mode register. Default value is 000; When = 001, will add the 5802E seek mode
Если что близко по смыслу, то пороговое значение отношения сигнал/шум в режиме поиска, но это поиск и к коммутации входов отношения не имеет.
Вставил рисунок из пдф но он не отобразился, а на какой даташит Вы ориентировались?
https://tsibrov.blogspot.com/2019/11/rda5807m-part1.html?m=1 отличная статья на русском.
6,7 биты 5го регистра.
Ну что же, огромное спасибо за статью! Т.е. получается биты 6 и 7 не документированные данные! Отличненько! У китайчат такое сплошь и рядом
Ребят, здравствуйте. А как сделать при включении полную очистку экрана? У меня на один экран работают два устройства: это радио и интернет радио на ESP12. Так при переключении с ESP на ардуино на экране остаются артефакты. Резет на ардуино к положительному результату не приводит, только помогает передёргивание питания. Можно ли это победить программным способом?
Вот здесь кино. https://yadi.sk/d/G1Dj4mig5x13hw
А банальная очистка экрана не помогает?
Скорее всего это из-за одновременного обращения к нему 2х устройств. После переключения на ардуино ESP, видимо, все еще пытается что-то передать на экран. Не знаю, какой интерфейс у экрана, но скорее всего какая-то из ног управления удерживается.
Я так полагаю, что очистка производится при инициализации. Отдельно команды для этой библиотеки не нашёл.
u8g.clear_screen(); не помогает - ругается при компиляции.
Экран подключен по I2C. SDA, SCK между устройствами переключается через к561кт3, питание подаётся от каждого устройства через диоды шоттки. Питание на устрорйства переключаются РПС45.
u8g.firstPage(); do { u8g.drawStr(0, 0, ""); } while (u8g.nextPage());А так очистится?
К сожалению, ничего не изменилось.
Проблема скорее всего "железная". Схему покажи, как ключ подключен. Тут еще может быть его сопротивление (80-160 Ом) роль играет.
Схема от руки, извините, но суть ясна.
https://yadi.sk/i/BDRRqeReXwongA
https://yadi.sk/i/HZF0CB_kigfrsg
Чёт рисунки не вставляются.
Проблема может и железная, но при переключении с фм радио на есп глюков не наблюдается. Можно, конечно, подпаяться к выводу reset и поставить ключ или чего-либо ещё, но не хочется колхозить. Должен же быть программный сброс или очистка буфера дисплея.
Т.е. проблема только если с ESP на ардуино? А если обратно, еще раз, то нормально?. Кондеры по питанию дисплея стоят достаточной емкости? Может при переключении напряжение просаживается и инициализация проходит до восстановления питания на дисплее? Еще, как вариант, можно убрать реле, и МК в сон уводить при переключении. Тогда "коммутационных недоразумений" точно быть не должно .
Т.е. проблема только если с ESP на ардуино?
Да.
А если обратно, еще раз, то нормально?.
Нет, не помогает даже reset на ардуино.
проблема только если с ESP на ардуино
Не понимаю зачем atmega если есть esp8266? Может следующие строки на мысли наведут, правда нет уверенности u8g и u8g2 это одно и то же или нет. Использовал чтоб небыло повторной инициализации дисплея после сна esp:
//магия с дисплеем при первой и последующих загрузках
if (first_boot) {
u8g2.begin(); u8g2.clearBuffer(); // First init of the displays
} else { // Init displays after wake up
u8x8_gpio_Init(u8g2.getU8x8());
u8x8_cad_Init(u8g2.getU8x8());
u8x8_gpio_SetReset(u8g2.getU8x8(), 1);
}
1. Копаю огород, роутер не добивает.
2. Начнётся война, интернет первым зависнит.
3. Да и так, местные новости иногда послушать.
Да я о другом, если в esp не закрытая прошивка то можно было бы внедрить код для руления fm приемником без ардуинки и микросхемы переключения.
Не, закрыта.
//магия с дисплеем при первой и последующих загрузках if (first_boot) { u8g2.begin(); u8g2.clearBuffer(); // First init of the displays } else { // Init displays after wake up u8x8_gpio_Init(u8g2.getU8x8()); u8x8_cad_Init(u8g2.getU8x8()); u8x8_gpio_SetReset(u8g2.getU8x8(), 1); }Ругается, библиотека другая, команд таких не знает.
Задолбался с программным сбросом, сделал аппаратный: при включении на PB5 коротко появляется единица, её через транзистор завёл на reset дисплея. Всё.
Вот что получилось - karmannoe fm radio na rda5807 + ESP mini.
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
Неможетэтовабыть.
подскажите пожалуйста в чем дело грузит с ошибкой
In file included from C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src\newchip.cpp:20:0: C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src/RADIO.h:116:1: warning: 'typedef' was ignored in this declaration typedef struct RADIO_INFO { ^~~~~~~ C:\Users\roy_wash\Documents\Arduino\libraries\Radio\src/RADIO.h:127:1: warning: 'typedef' was ignored in this declaration typedef struct AUDIO_INFO { ^~~~~~~ошибку напиши.
Всем привет. подскажите чайнику где в коде поменять цыферки плавности регулировки громкости, а то между самой тихой и второй ступенькой большая разница. из тихой музыки сразу в ор.
Неможетэтовабыть.
может! если текста нет - сам разберусь...
Там плавность не поменяешь. Всего у RDA5807 15 шагов регулировки громкости 0-15. И при 0 звук все-равно есть. Чтобы выключить совсем, нужно включить mute. Смотри подключенную библиотеку. Я правил под себя, при 0 громкости включал mute и сдвинул все на 1 вверх. В итоге получилось 16 шагов. Да, и при мелких наушниках регулировка слишком резкая, мне обычно хватает 2, дальше очень громко. На усилителе все нормально.
Kaa_2 здесь регулировка имеет 16 уровней и мельче ее не сделать,разве что поставить переменный резистор на выход RDA5807
Я ставил делитель на 2-х резисторах,подбирал номиналы так чтоб при максимальной громкости было как меньше искажений звука на выходе усилителя мощности с подключенными динамиками ,эти искажения смотрел осциллографом
из-за чего могут появляться помехи? все отлично пропаяно, не понимаю из-за чего наводки
Наводки от работы МК, шины I2C. Нужно по питанию RDA5807 фильтр хороший ставить. Хотя полность это проблему не решит.
https://blynk.hackster.io/B45i/dhwani-fm-radio-with-wifi-connectivity-87a1e1 -Ссылка хочу переделать под RDA5807m. чтоб работал автопоиск и регулировка громкости!или если можно добавить Blynk управление в скетч 1.7 версии автора скетча. с Олед экраном. и переделать с кнопок на энкодер. было бы супер...
Всем Доброго Времени суток.
помогите доработать скетч под RDA5807m. чтоб этот скетч, мог работать с приложением Blynk ссылка вверху на библиотеки и скетч и фото. помогите пожалуйста! мой телеграмм @tehnostark.
#include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <Wire.h> #include "TEA5767.h" const char KEY[] = "токен"; const char SSID[] = "точка доступа"; const char PASSWORD[] = "пароль"; const int PIN_SDA = 4; // D2; const int PIN_SCL = 5; // D1; TEA5767 Radio; int search_mode = 0; int g_muted = false; int search_direction; unsigned char buf[5]; double currentFreq = 102.4; int signalLevel; BLYNK_WRITE(V5) { String action = param.asStr(); if (action == "play") { setMute(true); } else if (action == "stop") { setMute(false); } else if (action == "next") { searchUp(); } else if (action == "prev") { searchDown(); } } BLYNK_WRITE(V2) { tuneTo(param.asFloat()); } void info() { if (Radio.read_status(buf) == 1) { currentFreq = floor(Radio.frequency_available(buf) / 100000 + .5) / 10; signalLevel = Radio.signal_level(buf); Blynk.virtualWrite(V0, currentFreq); Blynk.virtualWrite(V1, signalLevel); } else { Blynk.virtualWrite(V0, "Radio Not Connected !"); } } void setMute(bool state) { if (state) { Radio.mute(); } else { if (Radio.read_status(buf) == 1) { double currentFreq = floor(Radio.frequency_available(buf) / 100000 + .5) / 10; Radio.set_frequency(currentFreq); } } g_muted = state; } void searchDown() { search_mode = 1; search_direction = TEA5767_SEARCH_DIR_DOWN; Radio.search_down(buf); } void searchUp() { search_mode = 1; search_direction = TEA5767_SEARCH_DIR_UP; Radio.search_up(buf); } void tuneTo(double freq) { Radio.set_frequency(freq); } BLYNK_WRITE(V10) //функция, отслеживающая изменение виртуального пина 0 { int pinValue = param.asInt(); //переменная текущего состояния виртуального пина digitalWrite(D7, pinValue); //задаем значение на физическом пине NodeMcu D4 равное значению виртуального пина 0 } void setup() { pinMode(D7, OUTPUT); //объявляем D4 "выходным" пином Blynk.begin(KEY, SSID, PASSWORD); Wire.begin(PIN_SDA, PIN_SCL); Radio.init(); Radio.set_frequency(currentFreq); } void loop() { Blynk.run(); info(); }есть люди которые смогут мне помочь?
напишите мне в телеграмм. я подробно опишу что хочу доработать
мой телеграмм @tehnostark
Вы тут? может вы мне поможете?
Ношкой топнуть забыл.
помогите пожалуйста... я же оставил свой телеграмм... договоримся
Зачем переделывать если RDA5807 работает в режиме совместимости с TEA5767
нет автопоиска, нет регулировки громкости нет rds или еще продолжить? Да. на одном костылЕ, ковыляет... но не работает!
ПРОДОЛЖАЙТЕ!Автопоиск в 5767 есть! громкость нет,rds тоже нет
Про Blynk не знаю что это и зачем это и вообще он мне не нужен-если ставить кнопки и дисплей считаю лишним WIFI
в tea5767 автопоиск есть а в режиме совместимости с RDA5807 -нет! смысл продолжать если мне человек пишет - зачем мне две почки. я и с одной проживу. а вторую продам!
радиоприемник как дополнение для умного дома в приложении блинк! включение по таймеру и выключение! не тотько свет включать и выключать и смотреть погоду а послушать после блютус, аналоговое радио и на диване поуправлять настройками! а в место кнопок поставить энкодер. так и просится возле oled 0.96"
я не знаком с этим приложением Blynk,так что извините
а кнопки и олед-первое сообщение и далее
Как ты думаешь, техностарче, что проще, "немношко переделать всю программу" или тебе купить TEA5767 в Китае и не насиловать нам моск и глаза твоими восклицательными знаками после каждого предложения.
В статье https://blynk.hackster.io/B45i/dhwani-fm-radio-with-wifi-connectivity-87a1e1 стоит именно RDA5807...
а так переписать программу,вернее команды управления 5767 на 5807 и должно работать
Всех с Новым Годом!
Подскажите как можно масшабировать значок батарейки? Я хочу вместо режима сна отображать на дисплее состояние батареи с индикацией заряда в процентах. Но не могу сделать батарейку больше (на пол экрана).
void Energy() { if(MODE==1 && millis()-TimeOut>2000) flag=1; if(MODE==1 && millis()-TimeOut>3000) { readVcc(); u8g.firstPage(); do { u8g.setDefaultForegroundColor(); if(Voltage>85) u8g.drawBitmapP (31, 21, 2, 10, Bat7); else if(Voltage>70) u8g.drawBitmapP (31, 21, 2, 10, Bat6); else if(Voltage>55) u8g.drawBitmapP (31, 21, 2, 10, Bat5); else if(Voltage>40) u8g.drawBitmapP (31, 21, 2, 10, Bat4); else if(Voltage>25) u8g.drawBitmapP (31, 21, 2, 10, Bat3); else if(Voltage>10) u8g.drawBitmapP (31, 21, 2, 10, Bat2); else u8g.drawBitmapP (31, 21, 2, 10, Bat1); MODE=0; if(v!= EEPROM[1]) EEPROM[1] = v; if(k!= EEPROM[2]) EEPROM[2] = k; if(m!= EEPROM[3]) EEPROM[3] = m; if(b!= EEPROM[4]) EEPROM[4] = b; if(ms!=EEPROM[5]) EEPROM[5] = ms; if(s2!=s){s2=s; EEPROM[6] = int(s/100); EEPROM[7] = s%100; } if(sm!=EEPROM[8]) EEPROM[8] = sm; } while( u8g.nextPage() ); } if(MODE==0 && millis()-TimeOut<500) { MODE = 1; flag = 1; m = 7; } }Если менять width и height, то растягивает и ничего не видно, а как изменить сам размер картинки не имея оригинала?
const uint8_t Bat1[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat2[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat3[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat4[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat5[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat6[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC}; const uint8_t Bat7[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC};Тут же рисуется битовая маска 20 точек (2х10 точнее), судя по всему (библиотеку не пользовал) меняй значения:
constuint8_t Bat1[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC};, рисунок и количество точек, должно получится, как тебе нужно.
Получается мне нужно свою картинку создать, закинуть ее в image2code и сгенерировать двоичный массив, который вставить вместо строк автора
constuint8_t Bat1[] U8G_PROGMEM = { }?А как из двоичного массива обратно в картинку переконвертировать, чтоб понять что автор написал и отмасштабировать bmp?
С масштабированием разобрался. Команда u8g.setScale2x2(); и обратная ей u8g.undoScale(); в цикле do.
Другой вопрос. Почему при изменении напряжения на лабораторнике (подключен "+" к пину VIN) от 4,2 до 3,2В показывает проценты отличные от map? При 5,2В - 100%, при 4,2В - 0%, хотя в map стандартные значения li-ion.
void readVcc() { #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1.080 * 1023 * 1000 / result; // расчёт реального VCC Voltage = int(result); Voltage = map(Voltage, 3200, 4200, 0, 100); Voltage = constrain(Voltage, 0, 100); }Я бы хотел от 2S питать свое устройство,ом будет это радио и при изменении в скетче Voltage = map(Voltage, 3200, 8400, 0, 100); вообще доходит при 7В до 73% и дальше хоть крути, хоть нет, а процент не растет.
Может нужна какая калибровка напряжения при прошивке или еще как?
А по схеме vin куда подключен? Пологаю что на стабилизатор? Вы напряжение для начала посмотрите какое мк измеряет.
МК измеряет что на него приходит и при напряжении более 5,5 В МК сгорает (по даташиту) соответственно чтоб на vin подать больше, плата стабилизирует вход. 1. Я бы узнал толерантность дисплея и радио к 5 вольтам 2. Если такой нет, то напряжение можно измерять аналоговым пином через резисторный делитель, настроив изначально внутреннее опорное напряжение.
Вольтметром посмотрите что между VCC и GND