#include #include #include #define DDR_SPI DDRB #define DD_MOSI PB3 #define DD_MISO PB4 #define DD_SCK PB5 #define DD_SS PB2 GyverOLED oled; static int index = 0; static int arIndex = 0; static byte data[255]; static byte ar1[5]; static byte ar2[5]; static byte ar3[5]; void SPI_SlaveInit(void) { DDR_SPI = (1 << DD_MISO); SPCR = (1 << SPE) | (1 << SPIE); } ISR(SPI_STC_vect) { char received = SPDR; data[index] = received; index++; } void setup() { Serial.begin(2000000); SPI_SlaveInit(); oled.init(); // инициализация oled.clear(); // очистка Serial.println(); Serial.println("Initialization "); } void SetCommand(byte *data2){ byte command = data2[0]; // Отрезать 1 элемент от оставшихся byte result[index]; byte *ptr = &data2[1]; strcpy(result, ptr); Serial.print("\nReceived command: "); Serial.println(command); switch (command){ case 6: AddSymbol(result); break; } } void AddSymbol(byte *symbols){ Serial.print("Received Add: "); oled.setScale(3); // масштаб текста (1..4) oled.home(); // курсор в 0,0 oled.print("Привет!"); for(int i = 0; i < index - 1; i++) { Serial.print(symbols[i]); Serial.print(" "); } } // Функция для вычисления контрольной суммы XOR byte calculateXORChecksum(byte *data, int length) { byte checksum = 0; for (int i = 0; i < length - 1; i++) { checksum ^= data[i]; } return checksum; } // Вывод массива void arrayOut(byte *arr,int size){ Serial.print("Array: "); for(int i = 0;i 0) { if (arIndex == 0){ arIndex = 1; memcpy(ar1,data,5); }else{ if(arIndex == 1){ arIndex = 2; memcpy(ar2,data,5); }else{ arIndex = 0; memcpy(ar3,data,5); } } byte sum = 0; //arrayOut(ar1,5); int lenght = 5; sum = calculateXORChecksum(ar1, lenght); bool checkNull = false; byte last_1 = ar1[index - 1]; if (last_1 == sum) { Serial.println(); Serial.println("Старт вывода массивов"); Serial.println(sum); checkNull = checkArray(ar1, lenght); if(checkNull == true) { SetCommand(ar1); } Serial.println("Стоп вывода массивов"); index = 0; return; } //arrayOut(ar2,5); sum = calculateXORChecksum(ar2, lenght); byte last_2 = ar2[index - 1]; if (last_2 == sum) { Serial.println(); Serial.println("Старт вывода массивов"); Serial.println(sum); checkNull = checkArray(ar2, lenght); if(checkNull == true) { SetCommand(ar2); } Serial.println("Стоп вывода массивов"); index = 0; return; } //arrayOut(ar3,5); sum = calculateXORChecksum(ar3, lenght); byte last_3 = ar3[index - 1]; if (last_3 == sum) { Serial.println(); Serial.println("Старт вывода массивов"); Serial.println(sum); checkNull = checkArray(ar3, lenght); if(checkNull == true) { SetCommand(ar3); } Serial.println("Стоп вывода массивов"); index = 0; return; } Serial.println("Nothing ..."); index=0; } } }