Skocz do zawartości

Proste menu w Arduino i obsługa LCD I2C po raz enty...


bakardi92

Pomocna odpowiedź

Chłopie, program robi dokładnie to co mu napisałeś...

patrz, jak się program zaczyna to zmienna przyciskKolor wynosi 1, więc program do czasu aż nie wciśniesz przycisku od zielonej diody sprawdza tylko case 1 bo przyciskKolor=1, a w case 1 nie sprawdzasz przycisku od czerwonej diody tylko od zielonej... 

dopiero kiedy wciśniesz przycisk od zielonej zmieniasz przyciskKolor na 2 i w case 2 dopiero sprawdzasz czerwoną, ale znów nie zielonej... 

a w case 3, ustawiasz przyciskKolor=4, więc jak ma wrócić do 1??

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Edit (1h później...):

Przeanalizowałem twój kod, @bakardi92, i ogarnąłem o co chodzi.

Samo pulsowanie wyświetlacza przypisuję nagminnemu używaniu lcd.clear();, przez brak zrozumienia kodu, z którego korzystałem. (Lenistwo wzięło górę i nie spędziłem czasu z herbatką na analizę kodu.)

Nawet jeśli żaden z Was tego wpisu nie przeczytał, to dziękuję za współtworzenie tego forum i życzę dobrego dnia 🙂

 

Mam pytanko do @SOYER i @bakardi92co robi zmienna int lock, która jest najpierw ustawiana a potem zerowana?


Akurat piszę program oparty na twoim, @bakardi92, i mam problem przy wpisywaniu danych; będąc w ekranie 1 i chcąc przejść do ekranu 2, gdzie wpisuję dane, program tylko raz mignie ekranem 2 i od razu jestem z powrotem w ekranie 1. (Numeracja tak przyjęta, aby opisać program.)

Czyżby jakaś koincydencja mojego przypadku z brakiem funkcji lock?

Poza tym borykam się z 'pulsowaniem' ekranu (wyświetlacz lcd 20x4)...

 

Edytowano przez szczepko
Użytkownik sam rozwiązał problem zawarty we wpisie
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Witam.

Od kilku dni pracuję nad napisaniem kodu dzięki któremu można byłoby stworzyć prosty "BoardComputer". Jako, że korzystałem z rad zawartych w tym temacie uważam za sprawiedliwe zamieszczenie całości programu, który napisałem do tej pory. Zresztą prędzej czy później będą pewnie potrzebował pomocy przy pisaniu więc lepiej jak bardziej zaawansowani na bieżąco będą śledzić rozwój "tego czegoś".

Na zdjęciach zamieszczam ogólny obraz tego co chcę stworzyć. Mam nadzieję, że rozrysowałem to zrozumiale.

Ad1. W programie nie ma dziury między Menu7 a Menu8, po prostu zapomniałem o tej opcji i zacząłem rozpisywać opcję "ścieżka"

Ad2. Odnośnie części: Ścieżka -( tutaj jeszcze kod nie gotowy, tylko przedstawiam jak to chciałbym aby wyglądało)

"Ścieżka" - wyświetlane tylko jeśli w M3 włączona opcja "Ścieżki technologiczne"

1 "|" 4       to jest wartość z M1   i wartość z M4         natomiast  II jest wyświetlane jeśli M1=M5

Ad3. Czujniki indukcyjne to LJ18A3-8-Z/BY - po wykryciu impulsu pojawić się + na pin arduino

Ad4. Siłownik to będzie coś takiego https://botland.com.pl/silowniki-liniowe/5362-silownik-elektryczny-super-power-jack-2000n-75mms-12v-wysuw-20cm-5904422306892.html?cd=18298825651&ad=&kd=&gclid=Cj0KCQiA6LyfBhC3ARIsAG4gkF-fnE3OBXOnmTWu5K6KpaPbP1dSM5hJ2YWV_5ZCsN-XR_cVLs69cgYaAhR6EALw_wcB

#include <EasyButton.h>
#include <EasyButtonBase.h>
#include <EasyButtonTouch.h>
#include <EasyButtonVirtual.h>
#include <Sequence.h>

#include <Timers.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


#define BTN_BACK  11
#define BTN_NEXT  10
#define BTN_PREV  12
#define BTN_OK    13


EasyButton NEXT(BTN_NEXT);
EasyButton PREV(BTN_PREV);
EasyButton OK(BTN_OK);
EasyButton BACK(BTN_BACK);



Timer timer;

int AktPrz = 2; // aktualny przejazd 
float SzerRob = 3; // szer robocza narzędzia
bool ScTech = 0; // sciezki czy włączone
int SzSc = 4; // szerokosc sciezki 
int KiedSc = 4; // w ktorym przejazdzie sciezka
float ObKo = 5.28; // obwod koła
int Imp = 6; //ile impulsow na obrot koła
int Op = 100; // opuznienie imp tuz
int A = 0;
unsigned long czas = millis();                                          
unsigned long time = 0;

LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  Serial.begin(9600);
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  timer.begin(500);

  NEXT.begin();
  PREV.begin();
  pinMode(BTN_BACK, INPUT_PULLUP);
  pinMode(BTN_OK, INPUT_PULLUP);

}
void loop()
{

NEXT.read();
PREV.read();
OK.read();
BACK.read();

  switch (A)
{
  case 0:
 lcd.setCursor(0, 0);
      lcd.print("Predkosc");
      lcd.setCursor(0, 1);
      lcd.print(10.10); // odczyt z czuj prędkości
      lcd.setCursor(6, 1);
      lcd.print("km/h");

    lcd.setCursor(0, 2);
      lcd.print("Wydajnosc");
      lcd.setCursor(0, 3);
      lcd.print(1.2); // odczyt z czuj prędkości * szerokość maszyny
      lcd.setCursor(6, 3);
      lcd.print("ha/h");

    lcd.setCursor(15, 0);
      lcd.print("WOM");
      lcd.setCursor(13, 1);
      lcd.print(540); // odczyt czujnik wom
      lcd.setCursor(17, 1);
      lcd.print("RPM");
    lcd.setCursor(13, 2);
    if (ScTech = 1)
    {
      lcd.print("Sciezka");
      lcd.setCursor(12,3);
      lcd.print(AktPrz);
      lcd.setCursor(14,3);
      lcd.print("Z");
      lcd.setCursor(15,3);
      lcd.print(SzSc);
    }
    

       if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A++;
        lcd.clear();
      }
      break;

      case 1:
      lcd.setCursor(0, 0);
      lcd.print("BD");
      lcd.setCursor(0, 1);
      lcd.print(00); // odczyt z czuj prędkości
      lcd.setCursor(6, 1);
      lcd.print("km/h");

    lcd.setCursor(0, 2);
      lcd.print("BD");
      lcd.setCursor(0, 3);
      lcd.print(00); // odczyt z czuj prędkości * szerokość maszyny
      lcd.setCursor(6, 3);
      lcd.print("ha/h");

    lcd.setCursor(15, 0);
      lcd.print("BD");
      lcd.setCursor(13, 1);
      lcd.print(00); // odczyt czujnik wom
      lcd.setCursor(17, 1);
      lcd.print("RPM");

    lcd.setCursor(13, 2);
      lcd.print("BD");
      lcd.setCursor(15, 3);
      lcd.print(111);
       if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
      }

      break;
      case 2:
      lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Aktualny przejazd");
      lcd.setCursor(0, 1);
      lcd.print(AktPrz); // z czuj tuz
      if (NEXT.wasReleased())
      {
        AktPrz = AktPrz + 1;
      
      }
      if (PREV.wasReleased())
      {
        AktPrz = AktPrz - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 3:
  
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Szer robocza");
      lcd.setCursor(0, 1);
      lcd.print(SzerRob); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        SzerRob = SzerRob + 0.05;
      
      }
      if (PREV.wasReleased())
      {
        SzerRob = SzerRob - 0.05;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 4:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Czy sciezki aktywne");
      lcd.setCursor(0, 1);
      lcd.print(ScTech); 
      lcd.setCursor(10, 1);
      if (NEXT.wasReleased())
      {
        ScTech = ScTech = 1;
      
      }
      if (PREV.wasReleased())
      {
        ScTech = ScTech = 0;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 5:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Szerokosc sciezki");
      lcd.setCursor(0, 1);
      lcd.print(SzSc); // odczyt z czuj prędkości

      if (NEXT.wasReleased())
      {
        SzSc = SzSc + 1;
      
      }
      if (PREV.wasReleased())
      {
        SzSc = SzSc - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 6:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Przejazd sciezki");
      lcd.setCursor(0, 1);
      lcd.print(KiedSc); // odczyt z czuj prędkości
      if (NEXT.wasReleased())
      {
        KiedSc = KiedSc + 1;
      
      }
      if (PREV.wasReleased())
      {
        KiedSc = KiedSc - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 7:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Obwod kola");
      lcd.setCursor(0, 1);
      lcd.print(ObKo); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        ObKo = ObKo + 0.05;
      
      }
      if (PREV.wasReleased())
      {
        ObKo = ObKo - 0.05;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 8:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Ile IMP na obrot");
      lcd.setCursor(0, 1);
      lcd.print(Imp); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        Imp = Imp + 1;
      
      }
      if (PREV.wasReleased())
      {
        Imp = Imp - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 9:
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Opuznienie zliczania");
      lcd.setCursor(0, 1);
      lcd.print(Op); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("sec");
      if (NEXT.wasReleased())
      {
        Op = Op + 1;
      
      }
      if (PREV.wasReleased())
      {
        Op = Op - 1;
	}
 	if (OK.wasReleased())
      {
        A--;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;


}
}

EDIT: Oczywiście narazie mam tylko część Menu i BoardComputer. Jeszcze nie zacząłem pisać kodu części "wykonawczej" i tutaj pytanie. To ma być przed switch czy po?

BC1.jpg

BC2.jpg

Edytowano przez Adadadi
Link do komentarza
Share on other sites

26 minut temu, Adadadi napisał:

Jeszcze nie zacząłem pisać kodu części "wykonawczej" i tutaj pytanie. To ma być przed switch czy po?

To nie ma najmniejszego znaczenia, ale...

Z tego pięknego switcha zrób osobną funkcję, np. menu_glowne() w którym będziesz odpalał te rzeczy które akurat potrzebujesz.

Same ekrany, czyli jedną konkretną "klatkę"(obrazu) na lcd, też zrób jako osobne funkcje. 

Część wykonawczą też podziel na funkcje które będą miały konkretne zadanie.

Następnie wywołuj czy to w loop(), czy to w innych miejscach tą funkcję którą akurat potrzebujesz. Inaczej się pogubisz w tym za chwilę.

Brawo za rysunki i plany. Grunt to wiedzieć czego się chce.

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Traktuj konkretne case ze switcha nie jako kolejne obrazy na lcd, ale konkretne etapy pracy twojego komputra, który aktualnie robi jakąś rzecz, owszem może mu się wtedy zmienić obraz na lcd, ale wcale nie musi. 

Link do komentarza
Share on other sites

Z arduino mam styczność chyba niecałe 2 tygodnie i dlatego to tak topornie wygląda.

Czyli mówisz aby ostatecznie stworzyć coś takiego

definicje

określenie zmiennych

void setup

void (prędkość)

void (wydajność)

void(ścieżki)

void loop

{

switch

}

Link do komentarza
Share on other sites

Dobra, powiedzmy, coś mi zaczyna świtać ale będę musiał to rozrysować na kilku kartkach. Jak uda mi się coś zoptymalizować  i dopisać kolejne funkcję to będę aktualizował temat.

Link do komentarza
Share on other sites

Cześć wszystkim.

Troszkę dłubałem przy kodzie, nawet udało mi się uruchomić wskazania prędkości, wydajności oraz rpm wom. Dwa pierwsze z uwzględnieniem ustawień z MENU. Jednak nie do końca działa to tak jakbym chciał, wolałbym nie korzystać z opcji Interrupt. 

#include <EasyButton.h>
#include <EasyButtonBase.h>
#include <EasyButtonTouch.h>
#include <EasyButtonVirtual.h>
#include <Sequence.h>

#include <Timers.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define BTN_OK    13
#define BTN_PREV  12
#define BTN_BACK  11
#define BTN_NEXT  10
#define WOM       3
#define KOLO      2
#define SILOWNIK  6
#define cTUZ 9

EasyButton NEXT(BTN_NEXT);
EasyButton PREV(BTN_PREV);
EasyButton OK(BTN_OK);
EasyButton BACK(BTN_BACK);

Timer timer;

int TUZ = 0;
int AktPrz = 2; // aktualny przejazd 
float SzerRob = 3; // szer robocza narzędzia
bool ScTech = 0; // sciezki czy włączone
int SzSc = 4; // szerokosc sciezki 
int KiedSc = 4; // w ktorym przejazdzie sciezka
float ObKo = 5.28; // obwod koła
int Imp = 6; //ile impulsow na obrot koła
int Op = 100; // opuznienie imp tuz
int A = 0;
word obrot;
byte state;
byte state1;
int zerowanie = 4000;
int zerowanie1 = 4000;
int half_revolution_time = 0;
unsigned long volatile last_event;
int  czas_wom = 0;
unsigned long volatile  last_t_wom;
unsigned long lastmillis = 0; 

LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  Serial.begin(9600);
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  timer.begin(500);

  NEXT.begin();
  PREV.begin();
  OK.begin();
  BACK.begin();
  pinMode(cTUZ, INPUT_PULLUP);
  pinMode(WOM, INPUT_PULLUP);
  pinMode(SILOWNIK, OUTPUT);
  pinMode(KOLO, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(KOLO), rpm_fan, FALLING);
  attachInterrupt(digitalPinToInterrupt(WOM), rpm_wom, FALLING);
}

void rpm_fan() {


if (millis() - last_event < 5) { //debouncing

return;

}

half_revolution_time = (millis() - last_event);

last_event = millis();

}
void rpm_wom() {


if (millis() - last_t_wom < 5) { //debouncing

return;

}

czas_wom = (millis() - last_t_wom);

last_t_wom = millis();

}

void loop()
{
if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz)
{
lastmillis = millis(); // Aktualizacja lastmillis
}

// PREDKOSC && WYDAJNOSC
noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań
float  predkosc = ((ObKo/Imp)/half_revolution_time)*3600;
float wydajnosc = ((predkosc*1000)*SzerRob)/10000;
interrupts() ; //Przywraca przerwania
if (millis() - last_event >= zerowanie)
{
  predkosc = 0;
  wydajnosc = 0; 
}

// WOM
noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań
int RPM = (60000/czas_wom);
interrupts() ; //Przywraca przerwania
if (millis() - last_t_wom >= zerowanie1)
{
  RPM = 0;
}

//DEFINICJE KLAWISZY

NEXT.read();
PREV.read();
OK.read();
BACK.read();

//BOARDINFORMATOR

  switch (A)
{
  case 0: //BoardComputer1
 lcd.setCursor(0, 0);
      lcd.print("Predkosc");
      lcd.setCursor(0, 1);
      lcd.print(predkosc); // odczyt z czuj prędkości
      lcd.setCursor(5, 1);
      lcd.print("km/h");

    lcd.setCursor(0, 2);
      lcd.print("Wydajnosc");
      lcd.setCursor(0, 3);
      lcd.print(wydajnosc); // odczyt z czuj prędkości * szerokość maszyny
      lcd.setCursor(5, 3);
      lcd.print("ha/h");

    lcd.setCursor(15, 0);
      lcd.print("WOM");
      lcd.setCursor(13, 1);
      lcd.print(RPM); // odczyt czujnik wom
      lcd.setCursor(16, 1);
      lcd.print("RPM");
    
    lcd.setCursor(13, 2);
      lcd.print("Sciezka");
      lcd.setCursor(12,3);
      lcd.print(AktPrz);
      lcd.setCursor(14,3);
      lcd.print("Z");
      lcd.setCursor(15,3);
      lcd.print(SzSc);


       if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A++;
        lcd.clear();
      }
      break;

      case 1: //BoardComputer2
      lcd.setCursor(0, 0);
      lcd.print("BD");
      lcd.setCursor(0, 1);
      lcd.print(0000); // odczyt z czuj prędkości
      lcd.setCursor(5, 1);
      lcd.print("km/h");

    lcd.setCursor(0, 2);
      lcd.print("BD");
      lcd.setCursor(0, 3);
      lcd.print(0000); // odczyt z czuj prędkości * szerokość maszyny
      lcd.setCursor(5, 3);
      lcd.print("ha/h");

    lcd.setCursor(15, 0);
      lcd.print("BD");
      lcd.setCursor(13, 1);
      lcd.print(0000); // odczyt czujnik wom
      lcd.setCursor(17, 1);
      lcd.print("RPM");

    lcd.setCursor(13, 2);
      lcd.print("BD");
      lcd.setCursor(15, 3);
      lcd.print(0000);
       if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
      }

      break;
      case 2: //Menu1
      lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Aktualny przejazd");
      lcd.setCursor(0, 1);
      lcd.print(AktPrz); // z czuj tuz
      if (NEXT.wasReleased())
      {
        AktPrz = AktPrz + 1;
      
      }
      if (PREV.wasReleased())
      {
        AktPrz = AktPrz - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 3: //Menu2
  
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Szer robocza");
      lcd.setCursor(0, 1);
      lcd.print(SzerRob); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        SzerRob = SzerRob + 0.05;
      
      }
      if (PREV.wasReleased())
      {
        SzerRob = SzerRob - 0.05;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 4: //Menu3
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Czy sciezki aktywne");
      lcd.setCursor(0, 1);
      lcd.print(ScTech); 
      lcd.setCursor(10, 1);
      if (NEXT.wasReleased())
      {
        ScTech = ScTech = 1;
      
      }
      if (PREV.wasReleased())
      {
        ScTech = ScTech = 0;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 5: //Menu4
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Szerokosc sciezki");
      lcd.setCursor(0, 1);
      lcd.print(SzSc); // odczyt z czuj prędkości

      if (NEXT.wasReleased())
      {
        SzSc = SzSc + 1;
      
      }
      if (PREV.wasReleased())
      {
        SzSc = SzSc - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 6: //Menu5
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Przejazd sciezki");
      lcd.setCursor(0, 1);
      lcd.print(KiedSc); // odczyt z czuj prędkości
      if (NEXT.wasReleased())
      {
        KiedSc = KiedSc + 1;
      
      }
      if (PREV.wasReleased())
      {
        KiedSc = KiedSc - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 7: //Menu6
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Obwod kola");
      lcd.setCursor(0, 1);
      lcd.print(ObKo); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        ObKo = ObKo + 0.05;
      
      }
      if (PREV.wasReleased())
      {
        ObKo = ObKo - 0.05;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 8: //Menu7
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Ile IMP na obrot");
      lcd.setCursor(0, 1);
      lcd.print(Imp); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("m");
      if (NEXT.wasReleased())
      {
        Imp = Imp + 1;
      
      }
      if (PREV.wasReleased())
      {
        Imp = Imp - 1;
	}
 	if (OK.wasReleased())
      {
        A++;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;
  case 9: //Menu8
  lcd.home();
      lcd.setCursor(0, 0);
      lcd.print("Opuznienie zliczania");
      lcd.setCursor(0, 1);
      lcd.print(Op); // odczyt z czuj prędkości
      lcd.setCursor(10, 1);
      lcd.print("sec");
      if (NEXT.wasReleased())
      {
        Op = Op + 1;
      
      }
      if (PREV.wasReleased())
      {
        Op = Op - 1;
	}
 	if (OK.wasReleased())
      {
        A--;
        lcd.clear();
      
      }
      if (BACK.wasReleased())
      {
        A--;
        lcd.clear();
	}
  break;


}
}

Próbowałem również bazować na kodzie z tego przykłądu http://home.agh.edu.pl/~bartus/index.php?action=efekty&subaction=arduino&item=35 ale nie udało mi się tego połączyć tak aby to działało 

Trochę nie ogarniam jak to działa, że 
void loop() {} jest zamknięty a potem jest część licząco wyświetlająca
float xxx() {}                
 

PS: Dopiero zatrybiłem żeby bezpośrednio do case 0 wstawić "część liczącą" której wyniki powinny być wyświetlane przez ten case. Więc jutro będę eksperymentował dalej.

Link do komentarza
Share on other sites

Cześć, 

1 godzinę temu, Adadadi napisał:

Jednak nie do końca działa to tak jakbym chciał,

 

1 godzinę temu, Adadadi napisał:

nie udało mi się tego połączyć tak aby to działało 

To może napisz co działa, co nie działa, a jak byś chciał żeby działało. Bo zgadywać nie będziemy.

Dalej masz straszny nieporządek w kodzie, ale na początek zapytam co zależy od tego if:

 

if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz)

{

lastmillis = millis(); // Aktualizacja lastmillis

}

 

To z Twojego szkicu. Co robi ten fragment kodu?

Edytowano przez SOYER
Link do komentarza
Share on other sites

Miałem nadzieję że dzięki temu będzie możliwa regulacja częstotliwości odświeżania wyników na wyświetlacz.

Ogólnie chcę napisać to tak aby czujniki indukcyjne mogły być podłączone do każdego pinu a nie do tych które mogą obsługiwać interrupt.

Edytowano przez Adadadi
Link do komentarza
Share on other sites

Cześć,
Udało mi się dzisiaj popełnić taki kod

int impuls = 0;
boolean kolo = LOW;
unsigned long currentTime = 0;
unsigned long startTime = millis();
int obrot = 0;
boolean wom = LOW;
while (currentTime <= sampleTime)  {
    if (digitalRead(KOLO) == HIGH) {
      kolo = HIGH;
    }
    if (digitalRead(KOLO) == LOW && kolo == HIGH) {
      impuls++;
      kolo = LOW;
    }
    if (digitalRead(WOM) == HIGH){
      wom = HIGH;
    }
    if (digitalRead(WOM) == LOW && wom == HIGH){
      obrot++;
      wom = LOW;    
    }
    currentTime = millis() - startTime;

  }
float kph = ((impuls * (ObKo/Imp)) * 720) / 1000;
float hah = ((kph * 1000) * SzerRob) / 10000;
int rpm = (60000./ float(sampleTime)) * obrot;

Niestety mam problem z dodaniem tego do swojego głównego kodu z pętlą switch case. Plan był taki, że wcisnę to do jednego z case aby obliczana była aktualna prędkość i obroty oraz wyświetlane na lcd. Niestety po wykorzystaniu tego w case, menu stworzone z switch case przestaje działać.

Edytowano przez Adadadi
Doprecyzowanie
Link do komentarza
Share on other sites

Hejo ponownie.

Trochę dłubałem przy kodzie, na chwilę obecną wygląda tak:

/*..................................................
..       projek     BOARDINFORMATOR               ..
....................................................
*/

/*..................................................
..  zmienne+przypisanie pin                       ..
....................................................
*/
#include <EasyButton.h>
#include <EasyButtonBase.h>
#include <EasyButtonTouch.h>
#include <EasyButtonVirtual.h>
#include <Sequence.h>

#include <Timers.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define BTN_OK 13
#define BTN_PREV 12
#define BTN_BACK 11
#define BTN_NEXT 10
#define WOM 8
#define KOLO 9
#define SILOWNIK 6
#define cTUZ 7

EasyButton NEXT(BTN_NEXT);
EasyButton PREV(BTN_PREV);
EasyButton OK(BTN_OK);
EasyButton BACK(BTN_BACK);

Timer timer;

int TUZ = 0;
int AktPrz = 2;     // aktualny przejazd
float SzerRob = 3;  // szer robocza narzędzia
bool ScTech = 0;    // sciezki czy włączone
int SzSc = 4;       // szerokosc sciezki
int KiedSc = 4;     // w ktorym przejazdzie sciezka
float ObKo = 5.28;  // obwod koła
int Imp = 6;        //ile impulsow na obrot koła
int Op = 50;       // opuznienie imp tuz
int volatile A = 0;
const unsigned long sampleTime = 5000;
float kph = 0;
float hah = 0;
int rpm = 0;
bool lock = 0;



LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();


  NEXT.begin();
  PREV.begin();
  OK.begin();
  BACK.begin();
  pinMode(cTUZ, INPUT_PULLUP);
  pinMode(WOM, INPUT_PULLUP);
  pinMode(SILOWNIK, OUTPUT);
  pinMode(KOLO, INPUT_PULLUP);
}


void loop() {

  //DEFINICJE KLAWISZY
  NEXT.read();
  PREV.read();
  OK.read();
  BACK.read();
  Menu_Glowne();
}
/*...............................................................................................
..                                         FUNKCJE                                             ..
..                                                                                             ..
.................................................................................................
*/


/*.........................................................
..   INSTRUKCJA SWITH DZIĘKI KTÓREJ UTWORZONO MENU       ..
..                                                       ..
...........................................................
*/


void Menu_Glowne() {

  switch (A) {
    case 0:
      BoardComputer1();
      Nastepny_Ekran();
      break;

    case 1:
      BoardComputer2();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 2:
      Menu_1();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 3:
      Menu_2();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 4:
      Menu_3();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 5:
      Menu_4();
      Nastepny_Ekran();
      Poprzedni_Ekran();


      break;

    case 6:
      Menu_5();
      Nastepny_Ekran();
      Poprzedni_Ekran();


      break;

    case 7:
      Menu_6();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 8:
      Menu_7();
      Nastepny_Ekran();
      Poprzedni_Ekran();

      break;

    case 9:
      Menu_8();
      Poprzedni_Ekran();

      break;
  }
}
/*..................................................
..           PREDKOSC                             ..
....................................................
*/
float getKPH() {
  int impuls = 0;
  boolean kolo = LOW;
  unsigned long currentTime = 0;
  unsigned long startTime = millis();
  while (currentTime <= sampleTime & OK.isReleased()) {
    if (digitalRead(KOLO) == HIGH) {
      kolo = HIGH;
    }
    if (digitalRead(KOLO) == LOW && kolo == HIGH) {
      impuls++;
      kolo = LOW;
    }
    currentTime = millis() - startTime;
  }  
  float kph = ((impuls * (ObKo / Imp)) * 720) / 1000;
  return kph;
}
/*..................................................
..           HEKTARY                              ..
....................................................
*/
float getHAH() {
  float hah = ((kph * 1000) * SzerRob) / 10000;
  return hah;
}

/*..................................................
..          WOM                                   ..
....................................................
*/
float getWOM() {

  unsigned long currentTime1 = 0;
  unsigned long startTime1 = millis();
  int obrot = 0;
  boolean wom = LOW;
  while (currentTime1 <= sampleTime & OK.isReleased()) {
    if (digitalRead(WOM) == HIGH) {
      wom = HIGH;
    }
    if (digitalRead(WOM) == LOW && wom == HIGH) {
      obrot++;
      wom = LOW;
    }
    currentTime1 = millis() - startTime1;
  }

  int rpm = (60000. / float(sampleTime)) * obrot;
  return rpm;
}
/*..................................................
..             BoardComputer1                     ..
....................................................
*/
void BoardComputer1() {
  lcd.setCursor(0, 0);
  lcd.print("Predkosc");
  lcd.setCursor(0, 1);
  lcd.print(kph);
  lcd.setCursor(5, 1);
  lcd.print("km/h");

  lcd.setCursor(0, 2);
  lcd.print("Wydajnosc");
  lcd.setCursor(0, 3);
  lcd.print(hah);
  lcd.setCursor(5, 3);
  lcd.print("ha/h");

  lcd.setCursor(15, 0);
  lcd.print("WOM");
  lcd.setCursor(13, 1);
  lcd.print(rpm);
  lcd.setCursor(17, 1);
  lcd.print("RPM");

  lcd.setCursor(13, 2);
  lcd.print("Sciezka");
  lcd.setCursor(12, 3);
  lcd.print(AktPrz);
  lcd.setCursor(14, 3);
  lcd.print("Z");
  lcd.setCursor(15, 3);
  lcd.print(SzSc);
  kph = getKPH();
  hah = getHAH();
  rpm = getWOM();
}
/*..................................................
..              BoardComputer2                    ..
....................................................
*/
void BoardComputer2() {
  lcd.setCursor(0, 0);
  lcd.print("BD");
  lcd.setCursor(0, 1);
  lcd.print(0);
  lcd.setCursor(6, 1);
  lcd.print("km/h");

  lcd.setCursor(0, 2);
  lcd.print("BD");
  lcd.setCursor(0, 3);
  lcd.print(0);
  lcd.setCursor(6, 3);
  lcd.print("ha/h");

  lcd.setCursor(15, 0);
  lcd.print("BD");
  lcd.setCursor(13, 1);
  lcd.print(0);  //
  lcd.setCursor(17, 1);
  lcd.print("RPM");

  lcd.setCursor(13, 2);
  lcd.print("BD");
  lcd.setCursor(15, 3);
  lcd.print(0);
}


/*..................................................
..      KOLEJNY        EKRAN                      ..
....................................................
*/
int Nastepny_Ekran() {
  if (OK.wasPressed()) {
    A++;
    lcd.clear();
  }
  return A;
}
/*..................................................
..      POPRZEDNI        EKRAN                    ..
....................................................
*/
int Poprzedni_Ekran() {
  if (BACK.wasPressed()) {    
    A--;
    lcd.clear();
  }
  return A;
}
/*..................................................
..         MENU1                                  ..
....................................................
*/
int Menu_1() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Aktualny przejazd");
  lcd.setCursor(0, 1);
  lcd.print(AktPrz);  // z czuj tuz
  if (NEXT.wasReleased()) {
    AktPrz = AktPrz + 1;
  }
  if (PREV.wasReleased()) {
    AktPrz = AktPrz - 1;
  }
  return AktPrz;
}

/*..................................................
..         MENU2                                  ..
....................................................
*/
float Menu_2() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Szer robocza");
  lcd.setCursor(0, 1);
  lcd.print(SzerRob);
  lcd.setCursor(10, 1);
  lcd.print("m");
  if (NEXT.wasReleased()) {
    SzerRob = SzerRob + 0.05;
  }
  if (PREV.wasReleased()) {
    SzerRob = SzerRob - 0.05;
  }
  return SzerRob;
}
/*..................................................
..         MENU3                                  ..
....................................................
*/
int Menu_3() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Czy sciezki aktywne");
  lcd.setCursor(0, 1);
  lcd.print(ScTech);
  lcd.setCursor(10, 1);
  if (NEXT.wasReleased()) {
    ScTech = ScTech = 1;
  }
  if (PREV.wasReleased()) {
    ScTech = ScTech = 0;
  }
  return ScTech;
}
/*..................................................
..         MENU4                                  ..
....................................................
*/
int Menu_4() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Szerokosc sciezki");
  lcd.setCursor(0, 1);
  lcd.print(SzSc);
  if (NEXT.wasReleased()) {
    SzSc = SzSc + 1;
  }
  if (PREV.wasReleased()) {
    SzSc = SzSc - 1;
  }
  return SzSc;
}
/*..................................................
..         MENU5                                  ..
....................................................
*/
int Menu_5() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Przejazd sciezki");
  lcd.setCursor(0, 1);
  lcd.print(KiedSc);
  if (NEXT.wasReleased()) {
    KiedSc = KiedSc + 1;
  }
  if (PREV.wasReleased()) {
    KiedSc = KiedSc - 1;
  }
  return KiedSc;
}
/*..................................................
..         MENU6                                  ..
....................................................
*/
float Menu_6() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Obwod kola");
  lcd.setCursor(0, 1);
  lcd.print(ObKo);
  lcd.setCursor(10, 1);
  lcd.print("m");
  if (NEXT.wasReleased()) {
    ObKo = ObKo + 0.05;
  }
  if (PREV.wasReleased()) {
    ObKo = ObKo - 0.05;
  }
  return ObKo;
}
/*..................................................
..         MENU7                                  ..
....................................................
*/
int Menu_7() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Ile IMP na obrot");
  lcd.setCursor(0, 1);
  lcd.print(Imp);
  lcd.setCursor(10, 1);
  lcd.print("m");
  if (NEXT.wasReleased()) {
    Imp = Imp + 1;
  }
  if (PREV.wasReleased()) {
    Imp = Imp - 1;
  }
  return Imp;
}
/*..................................................
..         MENU8                                  ..
....................................................
*/
int Menu_8() {
  lcd.home();
  lcd.setCursor(0, 0);
  lcd.print("Opuznienie zliczania");
  lcd.setCursor(0, 1);
  lcd.print(Op);
  lcd.setCursor(10, 1);
  lcd.print("sec");
  if (NEXT.wasReleased()) {
    Op = Op + 1;
  }
  if (PREV.wasReleased()) {
    Op = Op - 1;
  }
  return Op;
}

A tak wygląda działanie:

https://drive.google.com/file/d/1gw9tgdDeBYwJbPs_vRYWTRShyh3KX9Ci/view?usp=sharing

 

Tak jak widać jeszcze nie ogarnąłem odświeżenia ekranu po poprzednich pomiarach.
Czyli np jeśli RPM wyświetli 156 to przy braku impulsów z czujnika ekran nie wróci do wartości "000" tylko wyświetla wartość "056".
Ponieważ pomiary są wykonywane w pętli 5 sec to aby przejść z case 0 do case 1 niestety koniecznej jest przytrzymanie klawisza - na chwilę obecną to akceptuję.
Aktualnie korzystam z pushbuttonów aby sprawdzić działanie kodu. Gdy napiszę resztę zacznę budować prototyp z czujnikami indukcyjnymi i siłownikiem elektrycznym.

PS: Pewnie i tak nikt nie odpisze.

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.