// PWM rizeni lokomotiv
// S.B. 2022

#include "U8glib.h"

// inicializace displeje
U8GLIB_SSD1306_128X64 oled_1(U8G_I2C_OPT_NONE);  // Display which does not send AC


// Definice pinu
#define Direction1 2
#define Direction2 4
#define Throttle 7
#define Stop 6
#define Brake 8
#define Forward 9
#define Reverse 10
#define PWM 3
//#define PWMX 5

byte temp;
byte Duty_Cycle;
int speed;
int smer;
int bargr;
String text;



void setup() {



  pinMode(Direction1, INPUT_PULLUP); //turn on pullup
  pinMode(Direction2, INPUT_PULLUP); //turn on pullup
  pinMode(Throttle, INPUT_PULLUP); //turn on pullup
  pinMode(Brake, INPUT_PULLUP); //turn on pullup
  pinMode(Stop, INPUT_PULLUP); //turn on pullup

 //Uvodni text s obrazkem
  oled_1.firstPage();  
  do {
    oled_1.setFont(u8g_font_fub14r);  
    oled_1.setPrintPos(0, 14); 
    oled_1.print(" TRUHLIKOV");
    oled_1.drawCircle(43, 40, 16);
    oled_1.drawLine(27,40,59,40);
    oled_1.drawLine(43,24,43,56);
    oled_1.drawCircle(43, 40, 18);
    oled_1.drawCircle(43, 40, 3);
    oled_1.drawCircle(86, 40, 16);
    oled_1.drawCircle(86, 40, 18);
    oled_1.drawCircle(86, 40, 3);
    oled_1.drawLine(70,40,102,40);
     oled_1.drawLine(86,24,86,56);


   oled_1.drawFrame(0,58,128,6);
   

  } while( oled_1.nextPage() );
  delay(5000);  

 
}

 

void loop() {
delay(5);  

  
//----------------------------------------------  Nastaveni frekvence PWM ------------------------------
//TCCR2B = TCCR2B & B11111000 | B00000001;    // set timer 2 divisor to     1 for PWM frequency of 31372.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000010;    // set timer 2 divisor to     8 for PWM frequency of  3921.16 Hz
//TCCR2B = TCCR2B & B11111000 | B00000011;    // set timer 2 divisor to    32 for PWM frequency of   980.39 Hz
TCCR2B = TCCR2B & B11111000 | B00000100;    // set timer 2 divisor to    64 for PWM frequency of   490.20 Hz (The DEFAULT)
//TCCR2B = TCCR2B & B11111000 | B00000101;    // set timer 2 divisor to   128 for PWM frequency of   245.10 Hz
//TCCR2B = TCCR2B & B11111000 | B00000110;    // set timer 2 divisor to   256 for PWM frequency of   122.55 Hz
//TCCR2B = TCCR2B & B11111000 | B00000111;    // set timer 2 divisor to  1024 for PWM frequency of    30.64 Hz

  if (digitalRead(Throttle) == LOW) {
 if (Duty_Cycle < 255) 
      Duty_Cycle=Duty_Cycle+5;
  }
  
  
    
     

  if (digitalRead(Brake) == LOW) {
   if (Duty_Cycle > 0) 
      Duty_Cycle=Duty_Cycle-5;
  }
   
 //Stop
 if (digitalRead(Stop) == LOW) {
   Duty_Cycle=0;
 }

//Test nulove rychlosti pro zmenu smeru

  if (Duty_Cycle == 0)    {

  //test registru smeru

  if  (smer==1)   {
   if (digitalRead(Direction1) == LOW) { 
    smer=0;
  }
  } else {
    if (digitalRead(Direction2) == LOW) { 
    smer=1;
  }
  }

  if (smer==0) {
    
    digitalWrite(Forward, HIGH);
    digitalWrite(Reverse, LOW);
  }
  else {
    
    digitalWrite(Forward, LOW);
    digitalWrite(Reverse, HIGH);
  }
  }
  
  analogWrite(PWM, Duty_Cycle);
  //analogWrite(PWMX, Duty_Cycle);

 // smycka obnovy displeje
  oled_1.firstPage();  
  do
  {


  //nastaveni fontu
  oled_1.setFont(u8g_font_ncenB14);
  // nastaveni pozice kurzoru
  oled_1.setPrintPos(0, 14); 


  if (smer == 1) {
 text = "-->> ";
 } else {

 text = " <<--";
}
  
  if(Duty_Cycle==0 ) {
  oled_1.print("= STOP =" );
  oled_1.println(text);
  } 
 

if (digitalRead(Brake) == LOW) {
  oled_1.print("BRZDA ####");
 
} else if 
  (digitalRead(Throttle) == LOW) {
  oled_1.print("ZRYCHLENI");
  oled_1.println(text);
 
 } else {

   oled_1.print("JIZDA "); 
   oled_1.print(text);
 
  }



  // zmena fontu
   oled_1.setFont(u8g_font_fub20);
  // nastaveni pozice
  oled_1.setPrintPos(10,45); 
  // mapovani pro % a bargraf
  speed=map(Duty_Cycle,0,255,0,100);
  bargr=map(Duty_Cycle,0,255,0,128);
  oled_1.print(speed);
  oled_1.setPrintPos(65,45); 
  oled_1.print("%");
  //bargraf
  oled_1.setPrintPos(0,57); 
  oled_1.drawLine(0,51,128,51);
  oled_1.drawLine(0,52,bargr,52);
  oled_1.drawLine(0,53,bargr,53);
  oled_1.drawLine(0,54,bargr,54);
  oled_1.drawLine(0,55,bargr,55);
  oled_1.drawLine(0,56,bargr,56);
  oled_1.drawLine(0,57,bargr,57);
  oled_1.drawLine(0,58,bargr,58);
  oled_1.drawLine(0,59,bargr,59);
  oled_1.drawLine(0,60,128,60);
  } 
  while(oled_1.nextPage());
  
  // "obnovovací frekvence displeje"
  delay(50);
}