За что я не очень люблю СИ, так за то что можно споткнуться на пустом месте и долго думать почему так? И в этот раз тоже, долго гуглил, почему у меня не получается передать массив строк в функцию, массив внутри «обнулялся». Наконец наткнулся, что СИ это не умеет. Умеет только передавать указатель на массив. Поэтому функция может выглять подобным образом:
Сдвиговые регистры — это два вида микроскхем 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 светодиодов в виде схемы:
И в виде сборки на макетных платах:
Простейший скетч для такой схемы подключения:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
intdataPin=8;// к выводу 14 регистра DS
intclockPin=10;// к выводу 11 регистра (SH_CP)
intlatchPin=9;// к выводу 12 регистра (ST_CP)
voidsetup(){
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
digitalWrite(latchPin,LOW);
}
voidloop(){
digitalWrite(latchPin,LOW);// начинаем передачу данных
shiftOut(dataPin,clockPin,LSBFIRST,0b11100000);
digitalWrite(latchPin,HIGH);// прекращаем передачу данных
В интернете полно инструкций по русификации данного дисплея. Фактически все рекомендации сводятся к замене в папке C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library (у вас другой путь) файла glcdfont.c вот этим файлом, и далее использованием вот этой функции для конвертации UTF-8 в кодировку windows-1251:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Stringutf8rus(Stringsource){
inti,k;
Stringtarget;
unsignedcharn;
charm[2]={'0','\0'};
k=source.length();i=0;
while(i<k){
n=source[i];i++;
if(n>=0xC0){
switch(n){
case0xD0:{
n=source[i];i++;
if(n==0x81){n=0xA8;break;}
if(n>=0x90&&n<=0xBF)n=n+0x30;
break;
}
case0xD1:{
n=source[i];i++;
if(n==0x91){n=0xB8;break;}
if(n>=0x80&&n<=0x8F)n=n+0x70;
break;
}
}
}
m[0]=n;target=target+String(m);
}
returntarget;
}
У меня увы, этот метод не сработал, как бы я не бился. И файл со скетчем переводил и в UTF-8 и в кодировку windows-1251 и чего только не делал. Ну не работает и всё тут. Потом на какое-то время заработало, потом опять перестало. Разобраться почему я так и не смог. В результате пошел другим путем — написал онлайн конвертор UTF-8 в восьмеричный формат кодировки windows-1251, после чего стало возможным вставлять в IDE код вида:
1
display.print("\307\300\317\323\321\312...");
Пусть не сильно читаемо в коде, но зато работает максимально стабильно. Конвертер ниже:
Кроме того, обнаружил еще одну не объяснимую ошибку при работе с данным дисплеем: если в программе интенсивно используется вывод в консоль при помощи Serial.println то на дисплее возникают артефакты в виде шума.
Редко когда пишу хвалебные отзывы, но тут исключение, ибо наконец нашел хороший инструмент для отладки проектов на ардулино и иже с ними, без доступа к железу. Лично для меня большим не удобством было, что чтобы что-то попрограммировать, нужно обязательно иметь железку, и обязательно собрать схему «в железе». Что иногда долго и безобразно выглядеще. Итак оно: https://wokwi.com/. Прмямо «онлайн» выбираешь железку, собираешь схему и прямо там пишешь код и выполняешь его. Светодиоды моргают, датчики и дисплеи показывают. А вот когда уже отладил всё, собирай железку живьем на здоровье..