20-05-2018, 17:59
Witam, stworzyłem mały projekt sterownika do maszyny którego zadaniem jest sterownie ręczne poprzez przyciski oraz możliwość załączenia sterownika w tryb auto i wtedy sterownik sam bez mojej ingerencji steruje maszyną, całość zwieńczona LCD z inormacjami o stanie sterownika
Projekt zrobiłem na UNO 3, ale nie chce jej pakować do pudełka , tylko dać kod do Pro Mini i go zostawić. Niestety jest mały problem z kodem na Uno działał idealnie tak jak chciałem,ale na Pro Mini już robi bzdury.Nie wiem czemu tak się dzieje, czy to nie wina tych INPUT_PULLUP ?
tak to wygląda :
Projekt zrobiłem na UNO 3, ale nie chce jej pakować do pudełka , tylko dać kod do Pro Mini i go zostawić. Niestety jest mały problem z kodem na Uno działał idealnie tak jak chciałem,ale na Pro Mini już robi bzdury.Nie wiem czemu tak się dzieje, czy to nie wina tych INPUT_PULLUP ?
tak to wygląda :
Kod:
// od 3 do 8 podłączone 2 przekaźniki 5V 3 przyciki,i 2 krańcówki
#define kr1 12
#define kr2 13 //poodłączone dodatkowe rzeczy
#define przyciskL 8
#define startStop 7
#define przyciskP 6
#define przekaznik1 4 // przekaźnik1
#define przekaznik2 3 //przekaźnik2
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
boolean kierunek = false; //false {LEWO}; true {PRAWO}
boolean tryb = true; //false {tryb AUTOMAT}; true {tryb RECZNY}
void setup() {
lcd.init();
pinMode(przekaznik1, OUTPUT);
pinMode(przekaznik2, OUTPUT);
digitalWrite(przekaznik1, HIGH); //wyłączenie "przekaźników" -
digitalWrite(przekaznik2, HIGH);
pinMode(kr1, INPUT_PULLUP); //
pinMode(kr2, INPUT_PULLUP); //
pinMode(przyciskL, INPUT_PULLUP);
pinMode(startStop, INPUT_PULLUP);
pinMode(przyciskP, INPUT_PULLUP);
}
void wylacznikKrancowyP() {
if (digitalRead(kr1) == LOW) {
delay(100); //debounce
if (digitalRead(kr1) == LOW) {
for (int i = 1; i < 10; i++) { //sygnalizacja zadziałania wyłącznika krańcowego
digitalWrite(przekaznik2, HIGH); //w rzeczywistym programie byłoby to bez sensu
digitalWrite(przekaznik2, LOW);
}
kierunek = false;
digitalWrite(przekaznik2, HIGH); //WYLACZ PRZEKAZNIK 2
delay(500);
digitalWrite(przekaznik1, LOW); //włącz przekaźnik 1
}
}
}
void wylacznikKrancowyL() {
if (digitalRead(kr2) == LOW) {
delay(100); //debounce
if (digitalRead(kr2) == LOW) {
for (int i = 1; i < 10; i++) { //sygnalizacja zadziałania wyłącznika krańcowego
digitalWrite(przekaznik1, HIGH); //w rzeczywistym programie byłoby to bez sensu
digitalWrite(przekaznik1, LOW);
}
kierunek = true;
digitalWrite(przekaznik1, HIGH); //wyłącz przekaźnik 1
delay(500);
digitalWrite(przekaznik2, LOW); //WLACZ PRZEKAZNIK 2
}
}
}
void trybAutomatycznyLCD() {
lcd.setCursor(0, 0);
lcd.print(" AUTOMAT ");
}
void kierunekLewoLCD() {
lcd.setCursor(0, 1);
lcd.print("[LEWO ]");
}
void trybRecznyLCD() {
lcd.setCursor(0, 0);
lcd.print(" RECZNY ");
}
void kierunekPrawoLCD() {
lcd.setCursor(0, 1);
lcd.print("[ PRAWO]");
}
void przekaznikiStopLCD() {
lcd.setCursor(0, 1);
lcd.print("[ ]");
}
void wlaczPrzekaznik1() {
digitalWrite(przekaznik1, LOW);
digitalWrite(przekaznik2, HIGH);
}
void wlaczPrzekaznik2() {
digitalWrite(przekaznik1, HIGH);
digitalWrite(przekaznik2, LOW);
}
void przekaznikiStop() {
digitalWrite(przekaznik1, HIGH);
digitalWrite(przekaznik2, HIGH);
}
void loop() {
if (digitalRead(startStop) == LOW) {
delay(100);
if (digitalRead(startStop) == LOW) {
if (tryb == true) { //jeżeli przed wcisnieciem, był tryb ręczny
tryb = false; //przełącz na automat
kierunek = false; //w automacie ruszaj w lewo
trybAutomatycznyLCD();
} else {
tryb = true;
trybRecznyLCD();
}
}
delay(200);
}
wylacznikKrancowyL(); //sprawdzenie, czy wylacznik krancowy nie jest wlaczony
wylacznikKrancowyP();
if (tryb == false && kierunek == false) {
trybAutomatycznyLCD();
kierunekLewoLCD();
wlaczPrzekaznik1();
} else if (tryb == false && kierunek == true) {
trybAutomatycznyLCD();
kierunekPrawoLCD();
wlaczPrzekaznik2();
} else if (tryb == true) {
if (digitalRead(przyciskL) == LOW && digitalRead(przyciskP) == HIGH) {
trybRecznyLCD();
kierunekLewoLCD();
wlaczPrzekaznik1();
} else if (digitalRead(przyciskL) == HIGH && digitalRead(przyciskP) == LOW) {
trybRecznyLCD();
kierunekPrawoLCD();
wlaczPrzekaznik2();
} else {
trybRecznyLCD();
przekaznikiStopLCD();
przekaznikiStop();
}
}
}