Матрица по SPI + 433 модуль
- Войдите на сайт для отправки комментариев
Всем привет.
Имеется 6 матриц включенных в 2 ряда по 3 штуки.
Управляется через 12 - 74HC595, включенных последовательно. Таким образом каждый ряд управляется по 3 проводам. Т.ж. подключен приемник 433Mz. Работает на Nano v3.
Проблема в следующем, по отдельности все работает хорошо, но вместе - не получается запустить приемник. Вот код:
#include <SPI.h> // для работы с 433 модулем #include <VirtualWire.h> //Пин подключен к ST_CP входу 74HC595(для 1 ряда индик) int latchPin1_1 = 10; //Пин подключен к SH_CP входу 74HC595(для 1 ряда индик) int clockPin1_1 = 9; //Пин подключен к DS входу 74HC595(для 1 ряда индик) int dataPin1_1 = 8; //Пин подключен к ST_CP входу 74HC595(для 2 ряда индик) int latchPin1_2 = 7; //Пин подключен к SH_CP входу 74HC595(для 2 ряда индик) int clockPin1_2 = 6; //Пин подключен к DS входу 74HC595(для 2 ряда индик) int dataPin1_2 = 5; // задержка int del= .10; // цифры для матрицы uint8_t digit_off[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // все выключено // размер цифр 5х7 uint8_t digit0[8] = {0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00}; uint8_t digit1[8] = {0x08,0x18,0x28,0x08,0x08,0x08,0x3c,0x00}; uint8_t digit2[8] = {0x38,0x44,0x04,0x08,0x10,0x20,0x7c,0x00}; uint8_t digit3[8] = {0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00}; uint8_t digit4[8] = {0x10,0x24,0x44,0x7c,0x04,0x04,0x04,0x00}; uint8_t digit5[8] = {0x7c,0x40,0x78,0x04,0x04,0x44,0x38,0x00}; uint8_t digit6[8] = {0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00}; uint8_t digit7[8] = {0x7c,0x04,0x08,0x10,0x20,0x20,0x20,0x00}; uint8_t digit8[8] = {0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00}; uint8_t digit9[8] = {0x38,0x44,0x44,0x3c,0x04,0x08,0x30,0x00}; // вспомогательные символы, точка, плюс, минус uint8_t pointpoint[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18}; uint8_t plus[8] = {0x00,0x00,0x40,0xE0,0x40,0x00,0x00,0x00}; uint8_t minus[8] = {0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00}; // строки uint8_t row1[8] = {0x04,0x08,0x02,0x10,0x40,0x01,0x20,0x80}; void setup() { //устанавливаем режим pinMode(latchPin1_1, OUTPUT); pinMode(clockPin1_1, OUTPUT); pinMode(dataPin1_1, OUTPUT); pinMode(latchPin1_2, OUTPUT); pinMode(clockPin1_2, OUTPUT); pinMode(dataPin1_2, OUTPUT); Serial.begin(9600); vw_set_ptt_inverted(true); // Required for DR3100 //vw_set_rx_pin(4); // pin куда подключен приемник (11 по умолчанию) vw_setup(1000); // скорость передачи бит в сек vw_rx_start(); // Start the receiver PLL running } void loop() { uint8_t buflen = VW_MAX_MESSAGE_LEN; uint8_t buf[buflen]; // если данные пришли if (vw_get_message(buf, &buflen)) { Serial.println("ok 10"); } for (int i = 0; i < 8; i++) { digitalWrite(latchPin1_1, HIGH); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, 255-digit1[i]); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, row1[i]); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, 255-digit2[i]); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, row1[i]); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, 255-digit3[i]); shiftOut(dataPin1_1, clockPin1_1, MSBFIRST, row1[i]); digitalWrite(latchPin1_1, LOW); digitalWrite(latchPin1_2, HIGH); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, 255-digit4[i]); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, row1[i]); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, 255-digit5[i]); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, row1[i]); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, 255-digit6[i]); shiftOut(dataPin1_2, clockPin1_2, MSBFIRST, row1[i]); digitalWrite(latchPin1_2, LOW); } delay(del); }
Это упрощенный код, в полной версии есть обработка действий по millis().
Проблема в функции shiftOut? она отнимает много времени.
Наверное для решения необходимо рассматривать прервывания, но я так и не понял как подцепить считывание.
Может еще использовать управление портами напрямую через DDRD, PORTD, PIND, но тоже не понял как это реализовать, возможно ли это вообще?
Может есть еще какие-нибудь варианты?