// Arduino Nano
// Rotacni enkoder KY-040 s iic OLED 128x64 displejem 
// vysilac na frekvenci 433MHz
// sensor pro mereni vlhkosti a teploty DHT11 


// OLED displej přes I2C
// řadič SSD1306
#include "U8glib.h"

// NiceRF 433MHz Vysílač STX882
// Transmitter programming
#include <VirtualWire.h>
#include "Timer.h"
#include "DHT.h"
#include <EEPROM.h>

// proměnné pro nastavení propojovacích pinů
int pinCLK = 3;
int pinDT  = 4;
int pinSW  = 5;



// proměnné pro uložení pozice a stavů pro určení směru a stavu tlačítka
word poziceEnkod = 0;
int stavPred;
int stavCLK;
int stavSW;
float hladina;
long hladinaCM;
float nastavHladina;
float r = 0.628;
// 2*pi*r = r

// proměnné pro nastavení propojovacích pinů MENU
int pinMenuCLK = 8;
int pinMenuDT  = 9;
int pinMenuSW  = 11;
int analogPin = 0;

// proměnné pro uložení pozice a stavů pro určení směru a stavu tlačítka MENU
int poziceMenuEnkod = 0;
int stavMenuPred;
int stavMenuCLK;
int stavMenuSW;
bool menuOn = false;
bool nastavOn = false;
bool nastav = false;
bool hladinaOn = false;
unsigned long prectiKapacitu;
int kapacita_procenta;

unsigned long casEEPROM= 21600000;
const int transmit_pin = 12;
String str;
char cstr[100];
String message = "";
unsigned int mlength;

#define pinDHT 2
#define typDHT11 DHT11     // DHT 11

 int tep;
 int vlh;
  
// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);

Timer t;

// inicializace OLED displeje z knihovny U8glib
U8GLIB_SSD1306_128X64 mujOled(U8G_I2C_OPT_NONE);

long int prepis = 0;
long int odecti = 0;
long int rozdil = 0;
long int minus = 0;
long int diff = 0;
long int waitTo = 0;
long int odpocet = 0;

// bitmapy pro lepsi orientaci v menu
const unsigned char arrowRotary [] PROGMEM = {
  0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,
  0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,
  0x00,0x00,0x07,0xFF,0xFF,0x80,0x00,0x00,
  0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,
  0x00,0x00,0x3F,0x80,0x0F,0xF0,0x00,0x00,
  0x00,0x00,0x7E,0x00,0x01,0xF8,0x00,0x00,
  0x00,0x01,0xF8,0x00,0x00,0x7C,0x00,0x00,
  0x00,0x01,0xF0,0x00,0x00,0x3E,0x00,0x00,
  0x00,0x03,0xE0,0x00,0x00,0x1F,0x00,0x00,
  0x00,0x01,0xC0,0x00,0x00,0x0F,0x80,0x00,
  0x00,0x00,0x80,0x00,0x00,0x07,0xC0,0x00,
  0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,
  0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x00,
  0x00,0x70,0x00,0x00,0x00,0x01,0xE0,0x00,
  0x00,0xF8,0x00,0x00,0x00,0x00,0xE0,0x00,
  0x01,0xFC,0x00,0x00,0x00,0x00,0xF0,0x00,
  0x03,0xFE,0x00,0x00,0x00,0x00,0xF0,0x00,
  0x0F,0xFF,0x00,0x00,0x00,0x00,0x70,0x00,
  0x1F,0xFF,0x80,0x00,0x00,0x00,0x78,0x00,
  0x3F,0x7F,0xC0,0x00,0x00,0x00,0x78,0x00,
  0x7E,0x7B,0xE0,0x00,0x00,0x60,0x78,0x60,
  0xF8,0x79,0xF0,0x00,0x00,0xF0,0x78,0xF0,
  0xF0,0x78,0xF0,0x00,0x00,0xFC,0x79,0xF0,
  0x60,0x78,0x60,0x00,0x00,0x7E,0x7B,0xE0,
  0x00,0x78,0x00,0x00,0x00,0x3F,0x7F,0xC0,
  0x00,0x78,0x00,0x00,0x00,0x1F,0xFF,0x80,
  0x00,0x38,0x00,0x00,0x00,0x0F,0xFF,0x00,
  0x00,0x3C,0x00,0x00,0x00,0x03,0xFE,0x00,
  0x00,0x3C,0x00,0x00,0x00,0x01,0xFC,0x00,
  0x00,0x3C,0x00,0x00,0x00,0x00,0xF8,0x00,
  0x00,0x1E,0x00,0x00,0x00,0x00,0x70,0x00,
  0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,
  0x00,0x07,0xC0,0x00,0x00,0x08,0x00,0x00,
  0x00,0x03,0xE0,0x00,0x00,0x1C,0x00,0x00,
  0x00,0x03,0xF0,0x00,0x00,0x3E,0x00,0x00,
  0x00,0x01,0xF8,0x00,0x00,0x7C,0x00,0x00,
  0x00,0x00,0x7E,0x00,0x01,0xF8,0x00,0x00,
  0x00,0x00,0x3F,0x80,0x0F,0xF0,0x00,0x00,
  0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,
  0x00,0x00,0x07,0xFF,0xFF,0x80,0x00,0x00,
  0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,
  0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00
};

// bitmapa logo firmy pri spusteni
const unsigned char epd_bitmap_TechCrowd_logo [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x07, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x3f, 0xc0, 0x0f, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x1f, 0xc0, 0x07, 0xf8, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00
};

void setup() {
   // Initialise the IO and ISR
  vw_set_tx_pin(transmit_pin);
  vw_setup(2000);       // Bits per sec
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);
  // nastavení propojovacích pinů jako vstupních
  pinMode(pinCLK, INPUT);
  pinMode(pinDT, INPUT);
  // nastavení propojovacího pinu pro tlačítko
  // jako vstupní s pull up odporem
  pinMode(pinSW, INPUT_PULLUP);
  // načtení aktuálního stavu pinu CLK pro porovnávání
  stavPred = digitalRead(pinCLK);    
  pinMode(pinMenuCLK, INPUT);
  pinMode(pinMenuDT, INPUT);
  // nastavení propojovacího pinu pro tlačítko
  // jako vstupní s pull up odporem
  pinMode(pinMenuSW, INPUT_PULLUP);
  // načtení aktuálního stavu pinu CLK pro porovnávání
  stavMenuPred = digitalRead(pinMenuCLK); 
  mojeDHT.begin();
} 

void loop() {
    //_____________________Baterie_________________________
  prectiKapacitu = analogRead(analogPin);
  // načtení stavu pinu CLK
  stavCLK = digitalRead(pinCLK);
  // pokud je stav CLK odlišný od předchozího měření,
  // víme, že osa byla otočena
  if (stavCLK != stavPred) {
    // pokud stav pinu DT neodpovídá stavu pinu CLK,
    // byl pin CLK změněn jako první a rotace byla
    // po směru hodin, tedy vpravo
    if (digitalRead(pinDT) != stavCLK) {
      // vytištění zprávy o směru rotace a přičtení
      // hodnoty 1 u počítadla pozice enkodéru
      Serial.print("Rotace vpravo => | ");
      poziceEnkod ++;
    }
    // v opačném případě, tedy pin DT byl změněn
    // jako první, se jedná o rotaci
    // proti směru hodin, tedy vlevo
    else {
      // vytištění zprávy o směru rotace a odečtení
      // hodnoty 1 u počítadla pozice enkodéru
      Serial.print("Rotace vlevo  <= | ");
      poziceEnkod--;
    }
    // vytištění aktuální hodnoty pozice enkodéru
    Serial.print("Pozice enkoderu: ");
    Serial.println(poziceEnkod);
  }
  // uložení posledního stavu pinu CLK
  // jako reference pro další porovnávání
  stavPred = stavCLK;
  // načtení stavu pinu SW - tlačítko
  stavSW = digitalRead(pinSW);
  // v případě stisknutí vytiskni informaci
  // po sériové lince
  if (stavSW == 0) {
    Serial.println("Stisknuto tlacitko enkoderu!");
    delay(500);
  }

//__________________________________________MENU____________________________________
   // načtení stavu pinu CLK
  stavMenuCLK = digitalRead(pinMenuCLK);
  // pokud je stav CLK odlišný od předchozího měření,
  // víme, že osa byla otočena
  if (stavMenuCLK != stavMenuPred) {
    // pokud stav pinu DT neodpovídá stavu pinu CLK,
    // byl pin CLK změněn jako první a rotace byla
    // po směru hodin, tedy vpravo
    if (digitalRead(pinMenuDT) != stavMenuCLK) {
      // vytištění zprávy o směru rotace a přičtení
      // hodnoty 1 u počítadla pozice enkodéru
      Serial.print("Menu vpravo => | ");
      poziceMenuEnkod ++;
    }
    // v opačném případě, tedy pin DT byl změněn
    // jako první, se jedná o rotaci
    // proti směru hodin, tedy vlevo
    else {
      // vytištění zprávy o směru rotace a odečtení
      // hodnoty 1 u počítadla pozice enkodéru
      Serial.print("Menu  vlevo  <= | ");
      poziceMenuEnkod--;
    }
    // vytištění aktuální hodnoty pozice enkodéru
    Serial.print("Pozice Menu: ");
    Serial.println(poziceMenuEnkod);
  }
  // uložení posledního stavu pinu CLK
  // jako reference pro další porovnávání
  stavMenuPred = stavMenuCLK;
  // načtení stavu pinu SW - tlačítko
  stavMenuSW = digitalRead(pinMenuSW);
  // v případě stisknutí vytiskni informaci
  // po sériové lince
  if (stavMenuSW == 0) {
    Serial.println("Stisknuto tlacitko Menu enkoderu!");
    delay(3000);
  }
    if (millis()-prepis > 1000) {
    // následující skupina příkazů
    // obnoví obsah OLED displeje
    mujOled.firstPage();
    do {
      // funkce vykresli vykreslí žádaný obsah
      startLogo();
      menuStart();
      novaHladina();
      vycisti();
      vykresli();
    } while( mujOled.nextPage() );
    // uložení posledního času obnovení
    prepis = millis();
  }
  //odesilani dat do koncentratoru kazdych 30 sekund-pro testovani zvoleno 5 sekund
if(millis()-rozdil > 30000){
    word hladinaMM = hladina*100;
    odesliData(hladinaMM, kapacita_procenta, tep, vlh);
    Serial.println("Odesilani dat");
    delay(1000);
    rozdil = millis();
}
//zalohovani namerenych dat (pozice enkoderu) jednou za 6 hodin
if(millis()-odpocet > casEEPROM){
  EEPROM_write(0, poziceEnkod);
  odpocet = millis();
  }
}

void startLogo(void){
  if(millis() < 5000)
    mujOled.drawBitmapP(0,0,16,64, epd_bitmap_TechCrowd_logo);
  }

  
void menuStart(void) {
  if (stavMenuSW == 0 && hladinaOn == false || menuOn == true && nastav == false){
    mujOled.drawFrame(2,2,124,60);
    if(poziceMenuEnkod > 4 || poziceMenuEnkod < -4){
      poziceMenuEnkod = 0;}
      
    if(poziceMenuEnkod == 0){
      mujOled.setFont(u8g_font_unifont);
      mujOled.setPrintPos(10, 35);
      mujOled.print("MENU");
      mujOled.drawBitmapP(55,10,8,44, arrowRotary);      
       if (stavMenuSW == 0){
            menuOn = false;
            hladinaOn = false;
            vykresli();
          }
        }
    menuOn = true;
    if (poziceMenuEnkod == 1 || poziceMenuEnkod == -1){
        mujOled.drawFrame(2,2,124,60);
        mujOled.drawFrame(2,20,124,42);
        mujOled.setFont(u8g_font_unifont);
        mujOled.setPrintPos(45, 15);
        mujOled.print("Menu 1");
        mujOled.setFont(u8g_font_unifont);
        mujOled.setPrintPos(15, 45);
        mujOled.print("hlad. na 0m ");
        if (stavMenuSW == 0){
          mujOled.drawFrame(4,22,120,38);
          menuOn = false;
          poziceEnkod = 0;
          Serial.println("pozice Enkoder: ");
          Serial.println(poziceEnkod);
          }
      }
      
    if(poziceMenuEnkod == 2 || poziceMenuEnkod == -2) {
          mujOled.drawFrame(2,2,124,60);
          mujOled.drawFrame(2,20,124,42);
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(45, 15);
          mujOled.print("Menu 2");
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(15, 45);
          mujOled.print("vlastni hlad. ");
          if (stavMenuSW == 0){
            mujOled.drawFrame(4,22,120,38);
            novaHladina();
            nastav = true;
          }
        }

    if(poziceMenuEnkod == 3 || poziceMenuEnkod == -3) {
          mujOled.drawFrame(2,2,124,60);
          mujOled.drawFrame(2,20,124,42);
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(45, 15);
          mujOled.print("Menu 3");
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(15, 35);
          mujOled.print("posledni uloz-"); 
          mujOled.setPrintPos(15, 50);
          mujOled.print("ena hodnota");
          if (stavMenuSW == 0){
            mujOled.drawFrame(4,22,120,38);
            poziceEnkod = EEPROM_read(0);
            Serial.println(poziceEnkod);
            Serial.println("_______________");
            menuOn = false;
          }
        }
        
    if(poziceMenuEnkod == 4 || poziceMenuEnkod == -4) {
          mujOled.drawFrame(2,2,124,60);
          mujOled.drawFrame(2,20,124,42);
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(45, 15);
          mujOled.print("Menu 4");
          mujOled.setFont(u8g_font_unifont);
          mujOled.setPrintPos(15, 45);
          mujOled.print("ulozeni hlad"); 
          if (stavMenuSW == 0){
            mujOled.drawFrame(4,22,120,38);
            EEPROM_write(0, poziceEnkod);
            menuOn = false;
          }
      }
   }
}
  
void novaHladina(void) {
  if (nastav == true || nastavOn == true){
            mujOled.drawFrame(2,2,124,60);
            mujOled.drawFrame(2,20,124,42);
            mujOled.setFont(u8g_font_unifont);
            mujOled.setPrintPos(12, 14);
            mujOled.print("vyska hladiny: ");
            mujOled.setFont(u8g_font_unifont);
            mujOled.setPrintPos(50, 45);
            nastavHladina = (r * poziceMenuEnkod / 20);
            mujOled.print(nastavHladina);
            mujOled.setPrintPos(75, 45);
            mujOled.print(" m");
            nastavOn = true;
            hladinaOn = true;
     
   if(stavMenuSW == 0 && nastavHladina > 0.2){
             Serial.println(" else if  ");
             mujOled.drawFrame(4,22,120,38);
             poziceEnkod = poziceMenuEnkod;
             nastav = false;
             nastavOn = false;
             menuOn = false;
             vykresli();
      }
    }
  }
  
void vycisti(void) {
  if (poziceEnkod < 0 && stavMenuSW == 1 && millis() > 5000 && menuOn == false && nastav == false) {
    mujOled.drawFrame(2,2,124,60);
    mujOled.setFont(u8g_font_unifont);
    mujOled.setPrintPos(20, 40);
    mujOled.print("zadna voda! ");
    Serial.println("Zadna voda ve studni!");  
    }
  }

// funkce vykresli pro nastavení výpisu informací na OLED
void vykresli(void) {
  if(poziceEnkod >= 0 && stavMenuSW == 1 && millis() > 5000 && menuOn == false && nastav == false){
    mujOled.drawFrame(2,2,124,40);
    mujOled.drawFrame(2,42,124,20);
    mujOled.setFont(u8g_font_unifont);
    mujOled.setPrintPos(5, 20);
    mujOled.print("vyska hladiny: ");
    mujOled.setPrintPos(45, 35);
    hladina = (r * poziceEnkod / 20);
    mujOled.print(hladina);
    mujOled.setPrintPos(75, 35);
    mujOled.print(" m");
    mujOled.setPrintPos(10, 55);
    mujOled.print(tep);
    mujOled.setPrintPos(25, 55);
    mujOled.print(" C");
    mujOled.setPrintPos(55, 55);
    mujOled.print(vlh);
    mujOled.setPrintPos(75, 55);
    mujOled.print("%");
    mujOled.drawFrame(100,45,20,12);
    mujOled.drawBox(120,49,2,5);
    sensorData();
    //indikator baterie na oled displeji
    if (prectiKapacitu > 830){
        mujOled.drawBox(100,45,20,10);
      }
    if (prectiKapacitu > 790){
       mujOled.drawBox(100,45,16,10);
      }
    if (prectiKapacitu > 750){
       mujOled.drawBox(100,45,12,10);
      }
    if (prectiKapacitu > 800){
       mujOled.drawBox(100,45,8,10);
      }
    if (prectiKapacitu > 710){
       mujOled.drawBox(100,45,4,10);
      }
    if (prectiKapacitu < 700){
       mujOled.drawLine(100,45,120,57);
      }  
    poziceMenuEnkod = 0;
    menuOn = false;
    nastavOn = false;
    nastav = false;
    nastavHladina = 0;
    hladinaOn = false;
  }
}
//ziskani dat: kapacity baterie z anal.vst. a tepl. a vlhkost od senzoru dht11 a 
 void sensorData(void){
  if (millis()-odecti > 5000){
    float realKapacita = (5 * (prectiKapacitu/1023));
    Serial.print("kapacita baterky: ");
    Serial.print(realKapacita);
    Serial.println(" V");
    kapacita_procenta = (realKapacita-3.2)*100; //(aktualni kapacita [V] - nenizsi mozna kapacita [V])*100 = xx%
    tep = mojeDHT.readTemperature();
    vlh = mojeDHT.readHumidity();
  // kontrola, jestli jsou načtené hodnoty čísla pomocí funkce isnan
  if (isnan(tep) || isnan(vlh)) {
    // při chybném čtení vypiš hlášku
    Serial.println("Chyba při čtení z DHT senzoru!");
  } else {
    // pokud jsou hodnoty v pořádku,
    // vypiš je po sériové lince
    Serial.print("Teplota: "); 
    Serial.print(tep);
    Serial.print(" stupnu Celsia, ");
    Serial.print("vlhkost: "); 
    Serial.print(vlh);
    Serial.println("%");
    odecti = millis();
    }
  }
 }
 //funkce pro odeslani dat po radiove komunikaci
 void odesliData(int hlad,int kapa,int tepl, int vlhk){
  message = message + hlad +"," + kapa + "," + tepl +"," + vlhk;
  mlength = message.length(); //najdi počet znaků v proměnné message
  str = message;
  str.toCharArray(cstr,100);
  vw_send((uint8_t *)cstr, mlength); // 
  vw_wait_tx(); // Počkej až se odešlou veškerá data
  str = "";
  message = ""; 
  }

//zapis do eeprom pameti
void EEPROM_write(uint8_t a, word b){
    Serial.print("eeprom write zavolana!");
    EEPROM.write(a, lowByte(b));
    EEPROM.write(a + 1, highByte(b));
}

//cteni z eeprom pameti
float EEPROM_read(uint8_t a)
{
    Serial.print("cteni z EEPROM: ");
    Serial.print(a+1);
    Serial.println(a);
    return word(EEPROM.read(a + 1), EEPROM.read(a));
}
