Ви не увійшли.
https://acode.com.ua/
Давно не розробляю під Ардуіно, але..
Я би так зробив:
Взяв один пристрій (датчик). Почитав на нього даташит. Розібрався з його роботою. Спробував підключити та отримати якісь дані. З ардуіно тяжко без відладчика. Тому активно використовував би відладку через вбудований uart. Покроково. Дійшов до цієї точки, - повідомлення в uart з якимось даними.
Всі нові можливості(функції) вводив поступово, з перевіркою чи не рухнуло все. З часом код захламляється, тому деякі функції можна згрупувати та винести в окремий файл.
Далі інший датчик так само.
І на закуску робота з sd картою.
Не намагайтесь запихнути все в loop()
Поділіть на прості функції, в яких розберетесь ви і той, хто буде потім читати ваш код.
Наприклад початок програми:
Інклюди
Дефайни
Глобальні змінні, якщо треба
Serial_init();
Sensor sensor1;//створюємо датчик
sensor1.init();//якась ініціалізація
Sensor sensor2;
sensor2.init;
SDcard sdcard;
sdcard.init();
loop(){
sensor1.handle();//обробляємо дані датчика
sensor2.handle();
sdcard.handle(sensor1, sensor2);//записуємо
delay(500);
}
Що до живлення від 9в, подивіться який стабілізатор стоїть на вашій платі. Потім знайдіть його даташит і стане все зрозуміло.
Привіт. Дуже сильно не поглиблювався у ваш код.
Бачу помилку
if (switch2State == LOW && !switch2Pressed) { // Если нажата вторая кнопка и флаг нажатия не установлен
MIDI.sendControlChange(0, 2, 1); // Отправить команду "Preset Back" на MIDI-канал 2
switch2Pressed = true; // Установить флаг нажатия
} else if (switch2State == HIGH && switch2Pressed) { // Если вторая кнопка отжата и флаг нажатия установлен
MIDI.sendControlChange(0, 2, 0); // Отправить команду "Preset Back" на MIDI-канал 2 с нулевым значением для отмены
switch2Pressed = false;
Не вистачає замикаючої фігурної скобки. Має бути
If (...){
....
}else if(...){
...
}
Вообще китайские st-link-и как бы подделка. В большинстве своем содержат китайские клоны корейцев. Будьте готовы к тому, что в один прекрасный день они перестанут обновляться. Проверено. Оригинальный двухгодичный st-link все ещё обновляется, а китайский того же года покупки уже нет.
И куб не требует, а информирует. Так что можно нажать "отмена, больше не напоминать" и забить на новую прошивку китайского st-link. Он и так шьёт нормально
Что вы запугали человека? Пусть учит от простого к сложному, по мере потребности. С++ это следующий уровень Си. Переменные, циклы, массивы, функции - это база, которую точно нужно знать.
Скажем так, начальная школа.
Структуры, перечисления, объединения - следующий этап.
Где то тут нужно влепить указатели.
Без классов можно прожит достаточно долго и без перегрузки функций и прочих плюшек.
Сам не напишешь, но пользоваться научишься
А в чем вопрос собственно? Дисплей принимает и отправляет команды простейшим способом. Никакие библиотеки вообще не нужны. Если вы умеете отправлять данные в терминал с Ардуино, то это все, что вам нужно для работы с ним.
Я включил а arduino ide галочку "внешний редактор" и пользуюсь простым notepad++.
Из удобств: Включил вкладку показывать функции. Теперь не нужно искать в длинном коде свои функции, все висит справа.
Также есть авто форматирование кода, поиск/замена, подсветка кода и прочие полезные плюшки.
Возможность изменить кодировку. Полезно при использовании кириллицы, так как в UTF-8 одна буква весит 2 байта и при большом количестве текста отжирается больше памяти.
Из неудобств: отсутствие автодополнения кода. Возможно есть какой то аддон для этой цели, но меня и так устраивает.
А вообще да, поддерживаю предыдущего оратора. Если есть готовый "модуль" то проще вынести его в отдельную вкладку.
Ты просто знаешь, что он есть и не нужно чтобы он мелькал все время перед глазами.
А это на кой хрен, можно поинтересоваться?
Первый пост, первые два предложения
И вообще, уже не актуально. Накодил, проверил, работает!. Думаю при планируемом использовании, ячейки хватит лет на 20-30
luminofor пише:Делаю зарядное устройство
Ну и в чем проблема запитать ардуинку (или что там у вас) от заряжаемого аккумулятора на время отключения питания и не искать себе приключений?
Не, ну тут вы не правы. Это вообще запутает схему дополнительными стабилизаторами и гальваническими развязками. Проще добавить пару строчек кода
Блиин!!! Господа, я жестоко ошибался! Еще раз посмотрел даташит. Это флеш имеет 10000 циклов перезаписи, а eeprom 100000!
Так что буду писать в одну ячейку и не выносить мозг!
luminofor, вы из простого делаете сложное. Сохраняйте состояние отдельно, счётчик отдельно. Состояние, как и счётчик сохраняются только при изменении. Счётчик что считает, как часто изменяется?
Счетчик считает, сколько раз я записал состояние сенсорных кнопок в ячейку.
Допустим состояние меняется примерно 10 раз в сутки. Что при ресурсе одной ячейки 10000 циклов дает 1000 циклов записи. Это почти три года безотказной работы, если писать все время в одну ячейку.
Насчет просто или сложно... Тут уже предложили два варианта, плюс мой первоначальный. Вопрос в квалификации программиста. Моя квалификация надеюсь хотя бы та троечку, так что буду выбирать из того, что смогу реализовать
Я как-то делал так:
В запись включается маркер. Когда вся память чистая (заполнена единицами), маркер имеет значение 0.
Первая свободная ячейка будет иметь маркер 1.
Когда вся память заполнится записями с нулевым маркером, начинаем заполнять её с самого начала записями с единичным маркером.
Какое значение маркера является активным узнаём из первой ячейки. Когда значения маркеров в первой и последней ячейках совпадают, пора менять активное значение.
Алгоритм успешно работает в пульте управления какой-то самолётной радиостанции. Точно не помню, но кажется Р-862
Тоже неплохо!
В принципе да. Имеется ввиду запомнить режим.
Делаю зарядное устройство с сенсорным дисплеем. Нужно управлять кнопками Заряд-Стоп-Разряд.
И когда питание пропадает, то Заряд или Разряд уже не восстанавливаются. То есть нужно как то хранить состояние.
Можно вообще не заморачиваться, тупо долбить в одну ячейку. 10000 циклов должно надолго хватить
YK1 предложил нормальную идею, я ее обдумал на предмет реализации.
Берем 7 и 6 биты под хранение состояния:
10 - Заряд
00 - Стоп
01 - Разряд
Остальные биты, с пятого 5 по 0, под счетчик. Получаем 64 цикла
Читаем ячейку eeprom, делаем логическое И с 0x00111111, получаем циклы, прибавляем единицу и в полученном числе выставляем биты 7 и 6, записываем обратно.
Счетчик досчитал до 64х - переходим в следующую ячейку.
Есть проблема первого включения, когда все ячейки по 255, но я где то встречал решение. Идея такая.
Стираем всю eeprom и делаем контрольную сумму всей области памяти, записываем на шпаргалку. В setup() проверяем контрольную сумму с шаблонной, если совпадают, то это первый запуск и нужно записать нули во все ячейки.
Как узнать в какой ячейке находится состояние - читаем все ячейки по маске 0x00111111, находим первое с числом меньше 64.
Примерно так. Осталось накодить
А что, хорошая мысль. Спасибо за идею!
Хочу запоминать состояние трех кнопок в eeprom. Но так как количество циклов перезаписи eeprom ограничено, хочу сдвигать байт в котором храниться инфа о кнопках. Одновременно может быть нажата только одна кнопка. Поэтому имеем всего три состояния.
Думаю, что нужно задействовать два байта.
1. Байт по адресу (cycle_count) счетчик со значениями 255-0
2. Байт состояния по адресу (button_state) со значениями 1,2,3 или 0,1,2 - не принципиально
Изначально байт счетчика находится по адресу EEPROM.length(), а байт состояния кнопок по адресу EEPROM.length()-1
В блоке setup() читаем состояние кнопок и делаем соответсвующие им действия
В loop() каждый раз при нажатии любой кнопки значение по адресу cycle_count уменьшается на единицу (от 255 до 0), а по адресу button_state записывается новое состояние кнопок
Как только по адресу cycle_count появляется ноль, значение из button_state переносится на адрес ниже, и адрес cycle_count тоже становиться ниже.
Ну и потом, когда таким образом во все ячейки eeprom запишутся нули, запускаю процедуру стирания (стирание eeprom = запись во все ячейки значения 255)
У меня возможно нубский вопрос. Что станет когда адрес дойдет до нуля? Как ардуинка отработает переполнение? Нужно ли предусмотреть какие то проверки для этого?
Дополнение.
Забыл сказать. Как ардуинке сказать по какому адресу искать состояние кнопок. Очень просто. Читаем ячейку EEPROM.length(), если там 0, переходим к EEPROM.length() - 1 и так далее, пока найдем не пустую ячейку с адресом допустим 200. Тогда ячейка с адресом 199 будет содержать состояние кнопок
Не все так просто как кажется. Оригинальные батареи имеют несколько видов защит. Защита от перезаряда, переразряда, высокой температуры, превышения какого-то количества циклов зарядки. Если у вас оригинальная батарея, то при отключении банок она с большой долей вероятности заблокируется. Более того, если она не раборает, то уже может быть заблокирована, а для надежности пережигается управляемый предохранитель. Разблокировать контроллер можно зная пароль и умея его вводить. Каждый вендор пытается защитить свой продукт от подделки. Поэтому в различных батареях присутствуют свои секреты.
Пример:
Введи часть пароля в ячейку 77, прочти из ячейки 78 число, потом от 1000 отними это число, введи в ячейку 79, затем введи оставшийся пароль в ячейку 77.
Если у вас китайская батарея, то можно с ней экспериментировать. Чипы в большинстве своем без сюрпризов, можно отключать/подключать банки. Но соблюдайте последовательность: отключаем от плюса к минусу, подключаем от минуса к плюсу
Ха! Я нашел! Если мы читаем word из 0x3c и получаем чушь, то нужно прочесть block оттуда же. И если в этом block мы видим значение LENOVO, то значения напряжений в каждого элемента нужно читать из ManufacturerData, то есть из ячейки 0x23.
И там мы видим примерно следующее:
42 01 01 01 00 00 A7 0D D4 0D C1 0D 05 80
, где:
VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - A7 0D
VCELL2: 3540 mV - D4 0D
VCELL1: 3521 mV - C1 0D
А так как используется little-endian, то правильно буде записать так:
VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - 0D A7
VCELL2: 3540 mV - 0D D4
VCELL1: 3521 mV - 0D C1
Ююхуу!
Igor1954 пише:2.Почему не могу скопировать диагностику, которую выдал IDE?
Да, хрен же тебя знает, почему ты не можешь. Вариантов тут много: руки не из того места, мозгов нету, не хотел и не копировал, ну и ещё бывают всякие причины.
Не обращай внимания. Этот троль просто постит ответы ради ответов. Он просто бог программирования и на форум заходит, чтобы потешить себя и поорать с других. Ни одного полезного совета. Какие его цели? Думаю он и сам не знает.
1. Посмотри по пути, на который указывает ошибка. Лежит ли там вообще тот библиотечный файл? Обрати внимание, что
#include <filename>
не то же самое, что
#include "filename"
2. Конкретно одну строку с ошибкой скопировать нельзя, да. Но можно скопировать всё и потом вставить в какой нить блокнот и рассмотреть подробнее. Удачи!
Дорогой друг Honey, я понимаю, что Вы подсказываете загадками
Мне кажется он вам пытается сказать, что
клавиша = прочитать_клавишу();
у вас выполняется только один раз. Все остальное время вы висите в for (;;)
И все что внутри for (;;) не знает о том, что нажималась другая клавиша
Продаю много батарей. И чтобы не терять лицо перед клиентами, проверяю их перед продажей. Смастерил себе зарядно-разрядную станцию на ардуине. Все как бы прекрасно, но некоторые батареи читаются не так как должны.
Собственно вопрос. Батареи у которых два контроллера - bq29330+bq8030 не правильно показывают напряжение на банках.
По даташитам информация берется из ячеек 3c, 3d, 3e, 3f.
При чтении оттуда получаю какую то ерунду.
Использую библиотеку SoftI2CMaster-master от товарища felias-fogg, кому интересно, можете взглянуть.
Честно содрал из других похожих проектов функцию чтения слова из двух байт:
int fetchWord(byte func)
{
i2c_start(deviceAddress << 1 | I2C_WRITE);
i2c_write(func);
i2c_rep_start(deviceAddress << 1 | I2C_READ);
byte b1 = i2c_read(false);
byte b2 = i2c_read(true);
i2c_stop();
return (int)b1 | ((( int)b2) << 8);
Из любых других чипов читается корректно.
Есть еще один способ прочитать данные - преобразователь интерфейса i2c-USB от Silicon Lab на микросхеме CP2112.
И есть прога be2works, она платная, но есть бесплатная демка, которая корректно в автомате показывает инфу из вышеупомянутых ячеек. Но! В ней есть возможность прочитать данные вручную. И при попытке прочитать эти ячейки, получаю ту же самую ерунду.
Задал вопрос у них на форуме, но там видать слишком гордые ребята, чтобы даром делиться информацией. Даже тему мою не пропустили.
Так вот, первый вопрос. Может кто нибудь знает как правильно прочитать эти ячейки?
Попутно задам второй вопрос. Но сначала расскажу к чему он.
Чип в батареях может быть seal, unseal и full access. Очень много батарей приходят с полным доступом. Это значит, что можно менять в них некоторые параметры (количество циклов, паспортную емкость, дату выпуска и т.д.)
Некоторые чипы без проблем принимают команду записи слова:
void write_word(uint8_t reg)
{
i2c_start((deviceAddress << 1) | I2C_WRITE);
i2c_write(reg);
i2c_rep_start((deviceAddress << 1) | I2C_WRITE);
i2c_write(b1 & 0xFF);
i2c_write(b2 & 0xFF);
i2c_stop();
}
На чипах bq4050 это работает. Но другие не позволяют запись слова. Записать возможно только один байт, через функцию записи байта. При этом второй байт автоматически принимает значение 0x16. То есть мне допустим нужно записать в ячейку значение 0x0201. Не получается. Зато получается записать 0x02. Тогда в ячейке получим значение 0x0216
Программа be2works записывает в ячейки правильно на любых чипах.
И второй вопрос. Может кто нибудь знает как правильно записать ячейки?
Я уж думаю, если нигде не найду инфу, придется делать i2c снифер, чтобы подсмотреть как они это делают
Примерно вот так должно получиться.
Картинка на дисплеях пока что тестовая, просто подбирал шрифт. И картинка на всех одинаковая - коммутатор i2c еще не приехал. Черные полосы на дисплеях - из за частоты обновления дисплеев, в живую их не видно
А на mega 2560 что, мало ног будет для этого всего? STM32 - это слишком круто для такой задачи
Не, нормас.
STM32F103C8T6 - 87грн
Arduino Mega 2560 R3 - 236грн
Да, я так и думал. Просто чтоб не паять рассыпуху, хотел готовый модуль
luminofor пише:они все коммутируют "минус". Плюс общий.
Это кто такую дурь сказал?
Ну вообще хотя бы тут:
тыц
Или тут:
тыц
Или тут:
тыц
Или тут:
тыц
Или тут:
тыц
Может я плохо ищу, но попадаются только с общим плюсом
luminofor пише:Надо на STM-ке делать.
лучше сразу на i7
Ну не знаю, как то тяжко программировать под i7-й, man-ы тяжело искать
Что плохого в STM?
В stm32f103c8t6 более чем подходящее количество ног
Блииин, я тут еще подумал. Pro Mini не хватит. Мало ног.
4 - меряют напряжение
4 - меряют ток
4 - включают заряд
4 - включают разряд
4 - кнопки управления
2- I2C
Надо на STM-ке делать