Witam.
Z góry zaznaczę, że w arduino to właściwie mój pierwszy program. Próbuję sklecić sobie program który liczy impulsy z enkodera inkrementalnego (500 impulsów na obrót), i co zadaną ilość impulsów (która będzie czasami zmieniana), włączy przekaźnik na określony czas (na początek 500ms a później jak ma też być ten czas regulowany w pewnych widełkach). Mam kod który obsługuje enkoder, oraz wyświetlacz 2x16, do tego 5 przycisków. Ale na razie przyciski są nieobsługiwane, będą potrzebne w przyszłości. Impulsy się liczą i są wyświetlane na lcd. Kręcąc pomału, w miarę wszystko działa. Problem jest jak zaczynam kręcić szybciej, tzn kiedy licznik naliczy 500 impulsów ale przekaźnik jeszcze jest włączony. W tedy punkt jakby ucieka na enkoderze. Problem jest również kiedy zaczynam kręcić enkoderem do tyłu, to przekaźnik jest jakby cały czas załączony. Proszę kogoś mądrego aby ogarnął mi prawidłowe zliczanie i złączanie przekaźnika.
Oto kod:
Przypuszczam, że ten fragment kodu jest zły. Ale jak to zrobić inaczej, nie mam pojęcia:
Z góry zaznaczę, że w arduino to właściwie mój pierwszy program. Próbuję sklecić sobie program który liczy impulsy z enkodera inkrementalnego (500 impulsów na obrót), i co zadaną ilość impulsów (która będzie czasami zmieniana), włączy przekaźnik na określony czas (na początek 500ms a później jak ma też być ten czas regulowany w pewnych widełkach). Mam kod który obsługuje enkoder, oraz wyświetlacz 2x16, do tego 5 przycisków. Ale na razie przyciski są nieobsługiwane, będą potrzebne w przyszłości. Impulsy się liczą i są wyświetlane na lcd. Kręcąc pomału, w miarę wszystko działa. Problem jest jak zaczynam kręcić szybciej, tzn kiedy licznik naliczy 500 impulsów ale przekaźnik jeszcze jest włączony. W tedy punkt jakby ucieka na enkoderze. Problem jest również kiedy zaczynam kręcić enkoderem do tyłu, to przekaźnik jest jakby cały czas załączony. Proszę kogoś mądrego aby ogarnął mi prawidłowe zliczanie i złączanie przekaźnika.
Oto kod:
#include <LiquidCrystal.h>
#include <Bounce2.h>
const byte LcdRS = 4;
const byte LcdEN = 5;
const byte LcdD4 = 6;
const byte LcdD5 = 7;
const byte LcdD6 = 8;
const byte LcdD7 = 9;
const byte LcdKolumny = 16;
const byte LcdWiersze = 2;
const byte Gora = A0; //Przycisk Góra A0
const byte Dol = A1; //Przycisk Dół A1
const byte Lewo = A2; //Przycisk Lewo A2
const byte Prawo = A3; //Przycisk Prawo A3
const byte Ok = A4; //Przycisk Ok A4
const byte Przekaznik = 13;
volatile unsigned int temp, counter = 0; //Ta zmienna będzie się zwiększać lub zmniejszać w zależności od obrotów enkodera
LiquidCrystal lcd(LcdRS, LcdEN, LcdD4, LcdD5, LcdD6, LcdD7); //Konfiguracja LCD
Bounce debouncer = Bounce(); // Inicjalizacja obiektu Bounce
void setup() {
Serial.begin (9600);
// Po konfiguracji przycisku, ustawienie działania funkcji Bounce :
debouncer.attach(Gora);
debouncer.attach(Dol);
debouncer.attach(Lewo);
debouncer.attach(Prawo);
debouncer.attach(Ok);
debouncer.interval(50); // interwał w ms
// Konfiguracja przycisków
pinMode(Gora, INPUT_PULLUP);
pinMode(Dol, INPUT_PULLUP);
pinMode(Lewo, INPUT_PULLUP);
pinMode(Prawo, INPUT_PULLUP);
pinMode(Ok, INPUT_PULLUP);
// Konfiguracja wyjścia przekaznika
pinMode(Przekaznik, OUTPUT);
//Konfiguracja pinów wejściowych enkodera A i B
pinMode(2, INPUT_PULLUP); // Wewnętrzny rezystor podciągający pin wejściowy 2
pinMode(3, INPUT_PULLUP); // Wewnętrzny rezystor podciągający pin wejściowy 3
//Konfiguracja przerwania
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);
//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
lcd.clear(); // Wyczyść ekran
lcd.setCursor(2, 0);
lcd.print("Licznik 1.0");
delay(2000); // Poczekaj 2 sekundy
lcd.clear(); // Wyczyść ekran
lcd.setCursor(0, 0);
lcd.print("Impulsy:");
}
void loop() {
// Aktualizacja funkcji Bounce :
debouncer.update();
// Wyślij wartość licznika
if( counter != temp ){
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(counter);
Serial.println (counter);
temp = counter;
}
if (counter >= 500) {
digitalWrite(Przekaznik, HIGH); // Załącz przekaznik
counter = 0; // Zresetuj licznik
delay(800);
digitalWrite(Przekaznik, LOW); // Wyłącz przekaznik
}
}
void ai0() {
// ai0 zostaje aktywowane, jeżeli stan pinu cyfrowego nr 2 zmienia się z NISKI na WYSOKI
// Sprawdź pin 3, aby określić kierunek
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}
void ai1() {
// ai0 zostaje aktywowane, jeżeli stan pinu cyfrowego nr 3 zmienia się z NISKI na WYSOKI
// Sprawdź z pin2, aby określić kierunek
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}Przypuszczam, że ten fragment kodu jest zły. Ale jak to zrobić inaczej, nie mam pojęcia:
if (counter >= 500) {
digitalWrite(Przekaznik, HIGH); // Załącz przekaznik
counter = 0; // Zresetuj licznik
delay(800);
digitalWrite(Przekaznik, LOW); // Wyłącz przekaznik