Решено: Нужна помощь зала. Не объяснимая ошибка

Прошу очень помощи зала. Ситуация следующая: пишу прошивку «Бортовой компьютер» автомобиля
на основе Arduino Nano (хобби у меня такое, не работа).
Минимальный пример, для воспроизведения ошибки (удалил по максимуму всё, лишь бы ошибка воспроизводилась):

https://wokwi.com/projects/390348182761575425

Проблема в следующем, не обьяснимым образом, теряются данные в переменных при вызове функции translate.

String translate(String txt){
return txt;
};

Например при использовании вот так (строки 141-146):

display.print(translate("Transmission:"));
display.setCursor(0, 20);
display.print(translate("Bridge:"));
display.setCursor(0, 30);
display.print(translate("GRM ribbon:"));
display.display();   

На экран выводится «Bridge». Однако стоит убрать строчку

 display.print(translate("GRM ribbon:"));

Как волшебным образом, на экран начинает выводится и Transmission: и Bridge:.

Дело не только в этой строчке. Закомментировав рандомно часть кода выше-ниже, вообще не относящегося к выводу на экран, можно добиться эффекта, что выводятся на экран все три строчки.

Подумал что памяти не хватает. Но вроде норм. Я уже начинаю сходить с ума, несколько дней бьюсь над проблемой. Проблема воспроизводится и на «реальном железе», не только в эмуляторе.

Update: си не умеет возвращать строки. Только массивы символов. Поэтому верный код что-то вроде:

const char * translate(char *txt){  
  return txt;
};

Arduino: передача массива строк в качестве функции

За что я не очень люблю СИ, так за то что можно споткнуться на пустом месте и долго думать почему так? И в этот раз тоже, долго гуглил, почему у меня не получается передать массив строк в функцию, массив внутри «обнулялся». Наконец наткнулся, что СИ это не умеет. Умеет только передавать указатель на массив. Поэтому функция может выглять подобным образом:


int PutMenu(int cnt,String *mass){
  for (int i=0; i <= cnt; i++){
    Serial.println(mass[i]);    
  };
}

void setup(void){
    Serial.begin(9600);
    String massive[] = { "name", "test", "name", "need", "you", "need", "me", "test" };
    PutMenu(3,massive);
    return 0;
}

void loop(void){

}

Чтиво за последние полгода

Давненько не выкладывал список литературы, которую читаю. Сын уже подрос, и читать ему не нужно. Дочь вырубается после 5 минут чтения, потому одну книгу мусолим уже полгода 😉 Потому выкладываю только свой список литературы. Не весь правда, т.к. FBReader меня немножко подвел не так давно, и список «читаемых сейчас» книг был утерян.

  • Сам себе властелин 1-5. Александр Горбов. Уже читал, но перечитал, т.к. вышла последняя часть. Оценка 4/5. Краткий сюжет: очередной попаданец волею судеб попадает в мир магии, где оказывается наследником замка Кулькуара
  • Отмороженный 1-4. Гарцевич Е.А. Оценка 3 из 5. МЧСник исследую мир в Арктике, попал в другое измерение, и был «заморожен» на 100 лет. Мосле того как это измерение было обнаружено, его спасли. И далее он помогает исследовать «Мерзлоту».
  • Адский Пекарь. Сергей Мутев, Сириус Дрейк. Оценка 1 из 5. Не дочитал, ибо бред..
  • Моё пространственное убежище 1-14. Дмитрий Дорничев. Оценка 3 из 5. Зомобиаппокалипсис с системой.

Arduino Nano: использование сдвигового регистра, пример

Сдвиговые регистры — это два вида микроскхем 74HC595 и 74HC165. первый соответственно предназначен для расширения пинов для выхода (например помигать светодиодиками, включать выключать реле и т.п.), а второй для расширения пинов для входа (чтение состояние кнопочек, датчики движения и т.п.). Наиважнейшим моментом отмечу, что считывать/посылать состояние можем только в виде 0 и 1. Соответственно подключать можем устройства которые могут принимать только два состояния: вкл и выкл. Рассмотрим схему 74HC595

Соответственно на выходы Q0-Q7 мы сможем подавать состояние включено-выключено (1/0), отослав на ногу DS маску из 8 бит. Например 01010101. Остальные ноги:

  • GND — земля
  • MR — сброс значений регистра. Сброс происходит при получении LOW
  • SH_CP (SRCLK) — линия синхроимпульса для передачи данных из DS во внутренние ячейки (вход для тактовых импульсов).
  • SH — shift, CP — clock pin ST_CP (RCLK) — линия синхроимпульса для передачи данных из внутренних ячеек, во внешние (синхронизация выходов).
  • ST — storage, CP — clock pin OE — инверсный, разрешение на вывод данных с внешних ячеек (вход для переключения состояния выходов из высокоомного в рабочее)
  • DS (SER) — линия последовательных данных (Data Serial)
  • VCC — питание, 5В

Пример подключения 8 светодиодов в виде схемы:

И в виде сборки на макетных платах:

Простейший скетч для такой схемы подключения:

int dataPin = 8;    // к выводу 14 регистра DS
int clockPin = 10;  // к выводу 11 регистра (SH_CP)
int latchPin = 9;  // к выводу 12 регистра (ST_CP)

void setup() {
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
	digitalWrite(latchPin, LOW);
}

void loop() {
	digitalWrite(latchPin, LOW); // начинаем передачу данных
	shiftOut(dataPin, clockPin, LSBFIRST, 0b11100000);
	digitalWrite(latchPin, HIGH); // прекращаем передачу данных
}

WordPress: Плагин для комментирования записей при помощи vk

Много лет пользовался плагином Social API. Да много лет заброшен и не поддерживается, но работало. Но тут случился переезд сайта с PHP 7.4 на PHP 8.2. И плагин отвалился., Поискал актуальные рабочие плагины — аналоги. Не нашел. Заброшены все. Пришлось закатать рукава и один из самых простых заброшенных плагинов довести до рабочего состояния. Результат выложен тут. Возможно дойдут руки и для того чтобы выложить в репозитарии WordPress.

1 29 30 31 32 33 300