#include <Adafruit_SSD1306.h> //для работы с дисплеем
const int screen_width = 128; // ширина дисплея в пикселях
const int screen_height = 64; // высота дисплея в пикселях
const int oled_reset = 4; //указание пина, предназначенного для сброса
Adafruit_SSD1306 display(screen_width, screen_height, &Wire, oled_reset );
int8_t x = 40; //расположение левого верхнего угла для большинства картинок
int8_t y = 26;
bool flag_active = false; //спит или не спит кот
const int cat_height = 37;
const int cat_width = 48;
//Создание двоичного изображения
static const unsigned char PROGMEM cat[] = //PROGMEM - хранение данных во флеш-памяти
{ B00000011, B00000000,B00001100, B00000000, B00000000, B00000000,
B00000011, B00000000,B00001100, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110011, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110011, B00000000, B00000000, B00000000,
B00001100, B00111111,B11000011, B00000000, B00000000, B11110000,
B00001100, B00111111,B11000011, B00000000, B00000000, B11110000,
B00110000, B00000000,B00000000, B11000000, B00000011, B00001100,
B00110000, B00000000,B00000000, B11000000, B00000011, B00001100,
B00110000, B00000000,B00000000, B11000000, B00000011, B00001100,
B00110000, B00000000,B00000000, B11000000, B00000011, B00001100,
B11000000, B00000000,B00000000, B00111111, B11000000, B11001100,
B11000000, B00000000,B00000000, B00111111, B11000000, B11001100,
B11000011, B00001100,B00110000, B00000000, B00110000, B11001100,
B11000011, B00001100,B00110000, B00000000, B00110000, B11001100,
B11000000, B00110011,B00000000, B00000000, B00001111, B11001100,
B11000000, B00110011,B00000000, B00000000, B00001111, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B00110000, B00000000,B00000000, B00000000, B00000011, B00000000,
B00110000, B00000000,B00000000, B00000000, B00000011, B00000000,
B00001100, B00000000,B00000000, B00000000, B00001100, B00000000,
B00001100, B00000000,B00000000, B00000000, B00001100, B00000000,
B00000011, B00111100,B11111111, B11001111, B00110000, B00000000,
B00000011, B00111100,B11111111, B11001111, B00110000, B00000000,
B00000011, B11000011,B11000000, B11110000, B11110000, B00000000,
B00000011, B11000011,B11000000, B11110000, B11110000, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000};
static const unsigned char PROGMEM cat_sleep[] =
{ B00000011, B00000000,B00001100, B00000000, B00000000, B00000000,
B00000011, B00000000,B00001100, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110011, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110011, B00000000, B00000000, B00000000,
B00001100, B00111111,B11000011, B00000000, B00000000, B00000000,
B00001100, B00111111,B11000011, B00000000, B00000000, B00000000,
B00110000, B00000000,B00000000, B11000000, B00000000, B00000000,
B00110000, B00000000,B00000000, B11000000, B00000000, B00000000,
B00110000, B00000000,B00000000, B11000000, B00000000, B00000000,
B00110000, B00000000,B00000000, B11000000, B00000000, B00000000,
B11000000, B00000000,B00000000, B00111111, B11000000, B00000000,
B11000000, B00000000,B00000000, B00111111, B11000000, B00000000,
B11000000, B00001100,B00000000, B00000000, B00110000, B00000000,
B11000011, B00001100,B00110000, B00000000, B00110000, B00000000,
B11000000, B00110011,B00000000, B00000000, B00001100, B00000000,
B11000000, B00110011,B00000000, B00000000, B00001100, B00000000,
B11000000, B00000000,B00000000, B00000000, B00000011, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000011, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00111111, B00001100,
B11000000, B00000000,B00000000, B00000000, B00111111, B00001100,
B00110000, B00000000,B00000000, B00000000, B11000000, B00110000,
B00110000, B00000000,B00000000, B00000000, B11000000, B00110000,
B00001100, B00000000,B00000000, B00000000, B00111111, B11000000,
B00001100, B00000000,B00000000, B00000000, B00111111, B11000000,
B00000011, B11111111,B11111111, B11111111, B11111100, B00000000,
B00000011, B11111111,B11111111, B11111111, B11111100, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000};
const int cat_snow_height = 46;
const int cat_snow_width = 48;
static const unsigned char PROGMEM cat_snow[] = //PROGMEM - хранение данных во флеш-памяти
{
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000,B00111111, B00000000, B00000000, B00000000,
B00000000, B00000000,B00111111, B00000000, B00000000, B00000000,
B00000000, B00000000,B11000011, B11000000, B00000000, B00000000,
B00000000, B00000000,B11000011, B11000000, B00000000, B00000000,
B00000000, B00000011,B00001100, B00111100, B00000000, B00000000,
B00000000, B00000011,B00001100, B00111100, B00000000, B00000000,
B00000000, B00001100,B00001100, B00111100, B00000000, B00000000,
B00000000, B00001100,B00001100, B00111100, B00000000, B00000000,
B00000011, B00110000,B00110000, B00000000, B00000000, B00000000,
B00000011, B00110000,B00110000, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110000, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110000, B00000000, B00000000, B00000000,
B00001100, B00111100,B00001100, B00000000, B00000000, B11110000,
B00001100, B00111100,B00001100, B00000000, B00000000, B11110000,
B00110000, B00000011,B11000011, B00000000, B00000011, B00001100,
B00110000, B00000011,B11000011, B00000000, B00000011, B00001100,
B00110000, B00000000,B00111111, B00000000, B00000011, B00001100,
B00110000, B00000000,B00111111, B00000000, B00000011, B00001100,
B11000000, B00000000,B00000000, B11111111, B11000000, B11001100,
B11000000, B00000000,B00000000, B11111111, B11000000, B11001100,
B11000011, B00001100,B00110000, B00000000, B00110000, B11001100,
B11000011, B00001100,B00110000, B00000000, B00110000, B11001100,
B11000000, B00110011,B00000000, B00000000, B00001111, B11001100,
B11000000, B00110011,B00000000, B00000000, B00001111, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000011, B00110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11000000,
B00110000, B00000000,B00000000, B00000000, B00000011, B00000000,
B00110000, B00000000,B00000000, B00000000, B00000011, B00000000,
B00001100, B00000000,B00000000, B00000000, B00001100, B00000000,
B00001100, B00000000,B00000000, B00000000, B00001100, B00000000,
B00000011, B00111100,B11111111, B11001111, B00110000, B00000000,
B00000011, B00111100,B11111111, B11001111, B00110000, B00000000,
B00000011, B11000011,B11000000, B11110000, B11110000, B00000000,
B00000011, B11000011,B11000000, B11110000, B11110000, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000};
const int cat_snow_sleep_height = 45;
const int cat_snow_sleep_width = 48;
static const unsigned char PROGMEM cat_snow_sleep[] =
{
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000,B00111111, B00000000, B00000000, B00000000,
B00000000, B00000000,B00111111, B00000000, B00000000, B00000000,
B00000000, B00000000,B11000011, B11000000, B00000000, B00000000,
B00000000, B00000000,B11000011, B11000000, B00000000, B00000000,
B00000000, B00000011,B00001100, B00111100, B00000000, B00000000,
B00000000, B00000011,B00001100, B00111100, B00000000, B00000000,
B00000000, B00001100,B00001100, B00111100, B00000000, B00000000,
B00000000, B00001100,B00001100, B00111100, B00000000, B00000000,
B00000011, B00110000,B00110000, B00000000, B00000000, B00000000,
B00000011, B00110000,B00110000, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110000, B00000000, B00000000, B00000000,
B00001100, B11000000,B00110000, B00000000, B00000000, B00000000,
B00001100, B00111100,B00001100, B00000000, B00000000, B00000000,
B00001100, B00111100,B00001100, B00000000, B00000000, B00000000,
B00110000, B00000011,B11000011, B00000000, B00000000, B00000000,
B00110000, B00000011,B11000011, B00000000, B00000000, B00000000,
B00110000, B00000000,B00111111, B00000000, B00000000, B00000000,
B00110000, B00000000,B00111111, B00000000, B00000000, B00000000,
B11000000, B00000000,B00000000, B11111111, B11000000, B00000000,
B11000000, B00000000,B00000000, B11111111, B11000000, B00000000,
B11000000, B00001100,B00000000, B00000000, B00110000, B00000000,
B11000011, B00001100,B00110000, B00000000, B00110000, B00000000,
B11000000, B00110011,B00000000, B00000000, B00001100, B00000000,
B11000000, B00110011,B00000000, B00000000, B00001100, B00000000,
B11000000, B00000000,B00000000, B00000000, B00000011, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000011, B11000000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11110000,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00000000, B11001100,
B11000000, B00000000,B00000000, B00000000, B00111111, B00001100,
B11000000, B00000000,B00000000, B00000000, B00111111, B00001100,
B00110000, B00000000,B00000000, B00000000, B11000000, B00110000,
B00110000, B00000000,B00000000, B00000000, B11000000, B00110000,
B00001100, B00000000,B00000000, B00000000, B00111111, B11000000,
B00001100, B00000000,B00000000, B00000000, B00111111, B11000000,
B00000011, B11111111,B11111111, B11111111, B11111100, B00000000,
B00000011, B11111111,B11111111, B11111111, B11111100, B00000000,
B00000000, B00000000,B00000000, B00000000, B00000000, B00000000
};
const int cat_sleep_z_height = 5;
const int cat_sleep_z_width = 8;
static const unsigned char PROGMEM cat_sleep_z[] =
{
B00011100,
B00000100,
B00001000,
B00010000,
B00011100,
};
const int cat_heart_height = 9;
const int cat_heart_width = 14;
static const unsigned char PROGMEM cat_heart[] =
{
B00001110,B01110000,
B00010001,B10001000,
B00100000,B00000100,
B00100000,B00000100,
B00010000,B00001000,
B00001000,B00010000,
B00000100,B00100000,
B00000010,B01000000,
B00000001,B10000000
};
void setup()
{
Serial.begin(9600); // инициирует последовательное соединение и задает скорость передачи данных (9600бит\с)
display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // это команда для инициализации OLED-дисплея SSD1306
display.display(); //обновление изменений на дисплее
display.clearDisplay(); //очистка дисплея
pinMode(A0, INPUT);
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
attachInterrupt(0,interrupt,FALLING); //прерывание при падении сигнала
}
void loop()
{
int analogValueL = analogRead(A0); //чтение аналогового сигнала с пина А0
float voltage = analogValueL / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(50 * 1e3 * pow(10, 0.7) / resistance, (1 / 0.7)); //конвертация в люксы
int analogValueT = analogRead(A1);
float celsius = 1 / (log(1 / (1023. / analogValueT - 1)) / 3950 + 1.0 / 298.15) - 273.15; //конвертация в цельсии
if(celsius > 0)
{
if(lux <= 100)
{
passive_cat(cat_sleep,cat_width,cat_height,0);
}
else
{
active_cat(cat,cat_width,cat_height,0);
}
}
else
{
if(lux <= 100)
{
passive_cat(cat_snow_sleep,cat_snow_sleep_width,cat_snow_sleep_height,-9);
}
else
{
active_cat(cat_snow,cat_snow_width,cat_snow_height,-9);
}
}
}
void interrupt()
{
flag_active = true;
}
void heart_blink(const uint8_t *pet, int w, int h,int coef_Y)
{
if(flag_active)
{
display.clearDisplay();
display.drawBitmap(x, y+coef_Y, pet, w, h, SSD1306_WHITE);
display.drawBitmap(x-10, y-8, cat_heart,cat_heart_width, cat_heart_height, SSD1306_WHITE);
display.display();
delay(1500);
}
flag_active = false;
}
void active_cat(const uint8_t *pet, int w, int h, int coef_Y)
{
heart_blink(pet,w,h,coef_Y);
display.clearDisplay();
display.drawBitmap(x, y+1+coef_Y, pet, w, h, SSD1306_WHITE); //Эта команда выводит изображение по пикселям. (В данном случае массив представленый в виде двоичного изображения)
display.display();
digitalWrite(13, HIGH);
delay(1000);
heart_blink(pet,w,h,coef_Y);
display.clearDisplay();
display.drawBitmap(x, y-1+coef_Y, pet, w, h, SSD1306_WHITE);
display.display();
digitalWrite(13, LOW);
delay(1000);
}
void passive_cat(const uint8_t *pet, int w, int h, int coef_Y)
{
display.clearDisplay();
display.drawBitmap(x, y+coef_Y, pet, w, h, SSD1306_WHITE);
display.display();
delay(1000);
display.drawBitmap(x+25, y-1+coef_Y, cat_sleep_z, 8, 5, SSD1306_WHITE);
display.display();
delay(1000);
display.drawBitmap(x+33, y-6+coef_Y, cat_sleep_z, 8, 5, SSD1306_WHITE);
display.display();
delay(1000);
display.drawBitmap(x+42, y-11+coef_Y, cat_sleep_z, 8, 5, SSD1306_WHITE);
display.display();
delay(1000);
flag_active = false;
}