// 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); }