#include <font12.h>
#include <Adafruit_GFX.h> //new
#include <Max72xxPanel.h> //new
#include "ArduinoOTA.h"
#include <ESP8266WiFi.h>
#include <IRrecv.h>
const uint8_t CS_PIN_DISPL = 15;
const int symbols[] = {32, 37, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 194};
const uint8_t X_DEVICES = 2;
const uint8_t Y_DEVICES = 8;
const uint8_t MATRIX_WIDTH = 64, MATRIX_HEIGHT = 16; //Общие размеры матрицы дисплея
Max72xxPanel matrix = Max72xxPanel(CS_PIN_DISPL, Y_DEVICES, X_DEVICES);
//ИК приемник
const uint16_t RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
byte sl;
int curX, curY, tw;
int startRunLineX = MATRIX_WIDTH - 1; //Стартовое положение надписи на дисплее по оси Y
int XStart = 0;
int YStart = 1;
void setup() {
Serial.begin(115200);
//Инициируем дисплей
sl = sizeof(symbols) / sizeof(symbols[0]);
matrix.setIntensity(1);
matrix.setPosition(0,7,0);
matrix.setPosition(1,7,1);
matrix.setPosition(2,6,0);
matrix.setPosition(3,6,1);
matrix.setPosition(4,5,0);
matrix.setPosition(5,5,1);
matrix.setPosition(6,4,0);
matrix.setPosition(7,4,1);
matrix.setPosition(8,3,0);
matrix.setPosition(9,3,1);
matrix.setPosition(10,2,0);
matrix.setPosition(11,2,1);
matrix.setPosition(12,1,0);
matrix.setPosition(13,1,1);
matrix.setPosition(14,0,0);
matrix.setPosition(15,0,1);
//Запускаем OTA
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
irrecv.enableIRIn();
}
void loop() {
ArduinoOTA.handle();
matrix.fillScreen(0);
runText("Hello World!", 0, 7, true);
matrix.write();
//Работа с пультом
if (irrecv.decode(&results)) {
switch (results.value) {
/*case 16738455: pultcode = 1; break; //1-температура на улице
case 16750695: pultcode = 2; break; //2-влажность на улице
case 16756815: pultcode = 3; break; //3-давление
case 16724175: pultcode = 4; break; //4-температура 1 этаж
case 16718055: pultcode = 5; break; //5-влажность 1 этаж
case 16743045: pultcode = 6; break; //6-температура 2 этаж
case 16716015: pultcode = 7; break; //7-влажность 2 этаж
case 16726215: pultcode = 8; break; //8-время
case 16734885: pultcode = 9; break; //9-дата
case 16730805: pultcode = 10; break; //10-IP адрес
case 16728765: pultcode = 11; break; //*-синхронизация времени с интернетом
case 16732845: pultcode = 12; break; //#-
case 16720605: pultcode = 13; break; //влево-
case 16736925: pultcode = 14; break; //вверх-
case 16761405: pultcode = 15; break; //вправо-
case 16754775: pultcode = 16; break; //вниз-*/
case 16712445: ESP.restart(); break; //ОК-перезагрузка
}
irrecv.resume(); // Receive the next value
}
}
bool runText(String text, int startX, int startY, bool state){//вывод статического текста
int i;
byte n;
uint32_t vertPixels;
byte fin = 0;
unsigned long tp;
tw = countFraseLength(text);
curX=startX + startRunLineX;
curY=startY;
for (i=0;i<text.length();i++){
byte sym = (byte)text[i];
if ((sym == 208) || ((sym == 209)))
{
i++;
sym = (byte)text[i];
}
if (sym == 194){
i++;
}
n=getArrayIndex(sym,sl,1);
for (byte j=0;j<12;j++){
vertPixels=pgm_read_word(&(font12[n][j]));
if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
getPixel12 (vertPixels, startY, state);
}
}
curX++;
}
if (startRunLineX >= 0 - tw){//каждый кадр смещаем начало отрисовки бегущей строки на 1 пиксель влево от правого края матрицы
startRunLineX--;
}
else {startRunLineX = MATRIX_WIDTH - 1; fin = 1;}
tp = millis();
while (millis() - tp != 25){}
return fin;
}
byte getPixel12 (uint32_t vertPixels, byte startY, bool tstate) {
byte pixel;
for (int k = 0; k < 10; k++) {
pixel = ((vertPixels >> k) & 0x01);
if (pixel==1){
//if (curX >= 0 && curX < MATRIX_WIDTH && curY >=0 && curY < MATRIX_HEIGHT){
//leds[curY][curX] = tstate;
matrix.drawPixel(curX,curY,tstate);
//}
}
curY++;
}
curY=startY;
curX++;
}
byte getArrayIndex(byte znach, byte ln, byte an){
for (byte n=0;n<ln;n++) {
if (an == 1){
if (symbols[n] == znach){
return n;
}
}
else {
/*if (smallnum[n] == znach){
return n;
}*/
}
}
}
int countFraseLength(String text){//считаем длину строки
int i, n;
uint32_t vertPixels;
int l=0;
for (i=0;i<text.length();i++){
byte sym = (byte)text[i];
if ((sym == 208) || ((sym == 209)))
{
i++;
sym = (byte)text[i];
}
if (sym == 194){
i++;
}
n=getArrayIndex(sym,sl,1);
for (byte j=0;j<12;j++){
vertPixels=pgm_read_word(&(font12[n][j]));
if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
l++;
}
if (j==11){//в конце каждого символа добавляем пробел
l++;
}
}
}
return l;
}
void WIFIinit() {
WiFi.mode(WIFI_STA);
byte tries = 60;
String _ssid = "DVKH24";
String _password = "Njrvfrjdf_1947";
WiFi.begin(_ssid.c_str(), _password.c_str());
while (--tries && WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(1000);
}
if (WiFi.status() != WL_CONNECTED)
{
// Если не удалось подключиться запускаем в режиме AP
StartAPMode();
}
else {
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
delay(1000);
}
}
bool StartAPMode() {
int IP1 = 10;
int IP2 = 10;
int IP3 = 10;
int IP4 = 10;
IPAddress apIP(IP1, IP2, IP3, IP4);
// Отключаем WIFI
WiFi.disconnect();
// Меняем режим на режим точки доступа
WiFi.mode(WIFI_AP);
// Задаем настройки сети
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
// Включаем WIFI в режиме точки доступа с именем и паролем
// хронящихся в переменных _ssidAP _passwordAP
String _ssidAP = "MYDev";
String _passwordAP = "123";
WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
}