#include <ELECHOUSE_CC1101_SRC_DRV.h>
#include <U8g2lib.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
// Инициализация дисплея U8g2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
int gdo0;
int t_sensor[8] = {0}; // Массив для хранения температур
const char* labels[8] = {"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8"};
unsigned long lastResetTime = 0;
// Объявление размера и массива изображения
#define logo_width 128
#define logo_height 64
const unsigned char logo_bits[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// (оставьте массив logo_bits без изменений)
};
// Функция для отрисовки части изображения
void drawBitmapPartial(int yStart, int yEnd) {
u8g2.clearBuffer();
for (int y = yStart; y < yEnd; y++) {
for (int x = 0; x < logo_width; x++) {
int byteIndex = x / 8 + y * (logo_width / 8);
uint8_t byte = pgm_read_byte(logo_bits + byteIndex);
uint8_t bit = byte & (1 << (7 - (x % 8)));
if (bit) {
u8g2.drawPixel(x, y);
}
}
}
u8g2.sendBuffer();
}
void drawVerticalProgressBar(int x, int y, int height, int value) {
u8g2.drawFrame(x, y, 8, height); // Рамка для прогресс-бара
int barHeight = map(value, 0, 120, 0, height - 2); // Преобразование значения в высоту прогресс-бара
u8g2.drawBox(x + 1, y + (height - 2 - barHeight), 6, barHeight); // Отрисовка прогресс-бара
}
void drawSquare(int x, int y, int squareNum) {
u8g2.drawFrame(x, y, 32, 32); // Отрисовка квадрата
u8g2.setFont(u8g2_font_ncenB08_tr); // Установка шрифта для числа
char tempStr[4]; // Массив достаточного размера для числа и нуля
itoa(t_sensor[squareNum - 1], tempStr, 10); // Конвертация числа в строку
int16_t strWidth = u8g2.getStrWidth(tempStr);
u8g2.drawStr(x + (12 - strWidth) / 2, y + 28, tempStr); // Отрисовка числа
u8g2.setFont(u8g2_font_5x8_tr); // Установка шрифта для метки
u8g2.drawStr(x + 3, y + 10, labels[squareNum - 1]); // Отрисовка метки
drawVerticalProgressBar(x + 22, y + 2, 30, t_sensor[squareNum - 1]); // Отрисовка прогресс-бара
}
void drawInitialScreen() {
u8g2.clearBuffer();
for (int i = 0; i < 4; i++) {
drawSquare(i * 32, 0, i + 1); // Верхний ряд
drawSquare(i * 32, 32, i + 5); // Нижний ряд
}
u8g2.sendBuffer(); // Отправка буфера на дисплей
}
void setup() {
gdo0 = 6; // GDO0 pin for Arduino Nano (Digital pin 6)
Serial.begin(9600);
u8g2.begin(); // Инициализация дисплея
// Анимация постепенного появления изображения
int totalLines = logo_height;
int delayTime = 2500 / totalLines; // Задержка для равномерного распределения в 2.5 секунды
for (int i = 0; i < totalLines; i++) {
drawBitmapPartial(0, i);
delay(delayTime);
}
delay(3000); // Задержка 3 секунды
drawInitialScreen(); // Отрисовка начального экрана
if (ELECHOUSE_cc1101.getCC1101()) {
Serial.println("Connection OK");
} else {
Serial.println("Connection Error");
}
ELECHOUSE_cc1101.Init();
ELECHOUSE_cc1101.setGDO0(gdo0);
ELECHOUSE_cc1101.setCCMode(1);
ELECHOUSE_cc1101.setModulation(0);
ELECHOUSE_cc1101.setMHZ(433.92);
ELECHOUSE_cc1101.setDeviation(47.60);
ELECHOUSE_cc1101.setChannel(0);
ELECHOUSE_cc1101.setChsp(199.95);
ELECHOUSE_cc1101.setRxBW(812.50);
ELECHOUSE_cc1101.setDRate(99.97);
ELECHOUSE_cc1101.setPA(10);
ELECHOUSE_cc1101.setSyncMode(2);
ELECHOUSE_cc1101.setSyncWord(211, 145);
ELECHOUSE_cc1101.setAdrChk(0);
ELECHOUSE_cc1101.setAddr(0);
ELECHOUSE_cc1101.setWhiteData(0);
ELECHOUSE_cc1101.setPktFormat(0);
ELECHOUSE_cc1101.setLengthConfig(1);
ELECHOUSE_cc1101.setPacketLength(0);
ELECHOUSE_cc1101.setCrc(1);
ELECHOUSE_cc1101.setCRC_AF(0);
ELECHOUSE_cc1101.setDcFilterOff(0);
ELECHOUSE_cc1101.setManchester(0);
ELECHOUSE_cc1101.setFEC(0);
ELECHOUSE_cc1101.setPRE(0);
ELECHOUSE_cc1101.setPQT(0);
ELECHOUSE_cc1101.setAppendStatus(0);
Serial.println("Rx Mode");
lastResetTime = millis();
}
byte buffer[8] = {0};
void loop() {
if (millis() - lastResetTime >= 3600000) { // 1 час = 3600000 мс
wdt_enable(WDTO_15MS); // Включить сторожевой таймер на 15 мс
while (true) {} // Ожидать перезагрузки
}
if (ELECHOUSE_cc1101.CheckReceiveFlag()) {
if (ELECHOUSE_cc1101.CheckCRC()) {
// Получить принятые данные и вычислить длину
int len = ELECHOUSE_cc1101.ReceiveData(buffer);
buffer[len] = '\0';
// Копировать принятые температуры в массив
for (int i = 0; i < 8; i++) {
t_sensor[i] = buffer[i];
}
// Отобразить температуры на экране
drawInitialScreen();
}
}
}
Loading
ssd1306
ssd1306