Skocz do zawartości

szczepulek

Użytkownicy
  • Zawartość

    29
  • Rejestracja

  • Ostatnio

Reputacja

4 Neutralna

O szczepulek

  • Ranga
    3/10

Ostatnio na profilu byli

45 wyświetleń profilu
  1. W moim wypadku ardu tylko do wysyłania. A esp do odbioru.. nasłuchiwania po serialu. Dalej śle po wifi co 5 min wyłapane dane z pomiarami i poprzez stronę php do bazy danych. Dla moich potrzeb te czasy są wystarczające do komfortowej pracy z monitorem temperatur. Z całym szacunkiem do wszystkich. Prosił bym aby nie toczyć tutaj wojen słownych. Tylko skupmy się na projekcie powtarzam ..z całym szacunkiem
  2. Na obecna chwilę poprzez odczyt millis na poczatku i na końcu loop obliczyłem średnią 28ms. Powiem tak, dla mnie to spory sukces przeskoczyć z tych 1568 ms na 118 a teraz do tych 30 ms. Wiem że da się to jeszcze przyspieszyć ale jak na bibliotekach standardowych myślę całkiem nieźle. Wyświetlacze odwiedzane co 125ms. Pewnie jeszcze pogrzebie i zejdę tych kilka ms niżej. Co do programu na obecną chwilę: Przyspieszenie interfejsu Wyświetlanie 2 wartości temperatur Dwa termometry ds18b20 obsługiwane bez potrzeby wpisywania ręcznie adresów Menu wyświetlane na LED 4 digits 7 segm. Tm1637 Menu obsługiwane 4 przyciskami, Menu(next), Up/dodaj, Down/ujmij, OK/Zapisz. Podczas edycji miga kontrolka(LED) o konieczności zapisania parametru nowego (porównanie do zawartości EEPROM. Przy braku aktywności w Menu po 20 sek powrót do wyświetlania temperatur, jeśli parametru zmieniono a nie zapisano -powrót do ustawień odczytanych z eeprom. Jeśli nie zapiszemy parametrów i przeskoczymy całe Menu ..to jak wyżej. Sprawdzenie na bierząco czy nie przekroczono max temp w przypadku przekroczenia - sygnał na przekaźnik. Możliwość wybrania Alarmu dla jednego z czujników z poziomu Menu. Wybranie linii /ID dla tego zestawu monitorującego. Obsługa pamięci eeprom (opcje update dla oszczędzania ilości zapisów, porósnania wyświetlanych informacji z zawartością pamięci. W przypadku wgrania na nową płytkę programu przy pierwszym uruchomieniu nadanie wartości domyślnych w pamięci. Wysyłanie przez Serial1 (znaki kontrolne początek i koniec przesyłanych danych. Na 11 znakach wysłane temp1 i temp2. Stan ALarmu. Nr Linii/id) Wysyłanie co około 28-30ms.
  3. od ostatniego czasu udzielania sie w tym temacie spoooro sie zmieniło w kodzie i działaniu programu, na plus oczywiście, @RFM przyjacielu, mówiłeś że te 43 ms na wyświetlacze to bardzo dużo, masz rację, zauważyłem to kiedy dodałem kilka warunków do programu, i menu przedewszystkim, to jak reagowały klawisze.. a raczej nie reagowały Świetnie było widać lagi kiedy w tle są wysyłane na serialu dane, a główna strona czy raczej pętla odpowiedzialna za wyświetlanie 2 temperatur była w użyciu (pokazMenu=0); Serial monitor wyrzucał nieregularnie linijki , zauważalne skokowe wyświetlanie podglądu danych. Do myślenia dało mi dlaczego po wyświetleniu menu nie ma tego efektu a dane w serial monitorze szaleją jedyny wniosek, wyświetlanie menu jest odświeżane przy zmianie naciśnięciu jakiegoś klawisza. Kilka postów wstecz wspomniałeś o użyciu millis() i co jakiś czas odpytywać temperaturę, zaświtało mi w głowie, a co jak by tak co jakiś czas wyrzucać komendę Display.. Wrzuciłem to w warunek z millis() i BOMBA Wszystko odżyło, klawisze lepiej reagują, i serial.write/ serial.print działają płynnie. Przykładowa wstawka wysw2LED[0] = display_2.encodeDigit(airoutCalkow/1000%10); //wyswietla cyfre dziesiatek z pomiaru cz.1 na wyswietlaczu pierwszym wysw2LED[1] = display_2.encodeDigit(airoutCalkow/100%10); //wyswietla cyfre jednosci z pomiaru cz.1 na wyswietlaczu pierwszym wysw2LED[2] = (SEG_A | SEG_B | SEG_F | SEG_G); // znak stopni zamiast kropki ktore brak w wyswietlaczu ktory posiadam wysw2LED[3] = display_2.encodeDigit(airoutCalkow/10%10); //pierwsza cyfra czesci dziesietnych // display_2.setSegments(wysw2LED); // wyswietlenie temperatury na pierwszym wyswietlaczu TO WŁAŚNIE LAGUJE TA LINIA /* po wrzuceniu tej linii kodu jak ponizej ,cały program pędzi jak Passaciak TDI na 4000obr/min z dwiema turbinami */ if (millis() - time4 >=100) { display_2.setSegments(wysw2LED); // wyswietlenie temperatury na pierwszym wyswietlaczu time4 = millis(); }
  4. Uaktualnienie informacji, zastosowałem menu do swojego projektu pomiaru temperatur, w miedzyczsie dokonałem kilku jeszcze zmian. Dodano/zmieniono: alarmowanie o nie zapisaniu zmiennej w ustawieniach przez blink na PIN 13 (miganie przy użyciu millis(), nie jest to takie trudne jak na początku się wydawało) DZIEKI @RFM za motywację próbowałem miganie na wyświetlaczach ale przez sposób ich sterowania efekt był mizerny. dodano regułkę podczas przebywania na jednej ze stron Menu i braku aktywności któregokolwiek z klawiszy przez określony czas (u mnie 15 sek, maks. 65 sek z zmienna typu WORD) samoczynnie powraca do funkcji podstawowej, czyli wyświetlania u mnie temperatur czujników. ukończyłem, 2 minuty.. if(millis() - autoExitMenu > autoExitCzas) //warunek wyprowadza z menu, jesli brak aktywnosci podana ilosc czasu (ms) { if (eepromOdczyt[s] != tabStrMenu[s]) // jeśli wartość w pamięci, i w tablicy przechowujacej obecne nastawy są różne to... tabStrMenu[s] = eepromOdczyt[s]; // zapisz do tablicy odczyt z eeprom, pokazMenu = 0; // przejdz do glownej funkcji autoExitMenu = millis(); // kasowanie odliczania braku aktywnosci, a raczej zapisanie obecnego czasu dzialania do obliczania. } /* czas zapisu do EEPROM w arduino to chyba 3ms, nie wiem ile zamuje odczyt, na wszelki wypadek na poczatku petli glownej przypisalem do tablicy eepromOdczyt[] wartosci odczytane z EEPROM.read(); kilka razy odnosze sie w swoim kodzie do tych wartosci, wiec jesli to ma znaczenie to przyoszczedze kilka ms, jesli nie, to i tak nic sie nie stalo ;-P */ animacje przy zapisaniu do eeprom i zatwierdzeniu. Gdy skończę wcześniejszy projekt umieszczę kod ze zmianami..
  5. a jednak, coś jeszcze :D.. dotychczasowy program wymagał przycisku by wejść w menu, wyjść z menu. przycisku by przeskakiwać pomiędzy stronami menu, przycisku do podnoszenia w górę zmiennych, i zmniejszających zmienne. w sumie 4, no nie ukrywam że 5 też dojdzie do zatwierdzania / zapisywania ustawień do eeprom. Tak czy inaczej można się pozbyć jednego do przeskakiwania po stronach i użyć do tego wyzwalającego menu. W chwili wciśnięcia zamiast zmieniać stan zapamiętany dla zmiennej pokazMenu, ustawiamy na 1. W wyniku czego ładuje się strona 1, nasłuchujemy zamiast buttonPin, nadal buttonMenu. po przyciśnięciu go zamiast wrócić do głównej cześci programu z manu, przeskakujemy na następną stronę drugą, trzecią itd.. w zależności ile ich ustawiono jeżeli jak ja używacie 2 stron, dodajemy jeszcze trzecią, i w linii case 3: //przykładowa ostatnia strona { pokazMenu = 0; //powracamy do głównej części programu } break; jak w przykładzie, wpisanie pokazMenu =0; ustawia warunek spełniający wymagania dla głównej części funkcji działającej domyślnie. by to działało należy zmienić jeszcze te części kodu: if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to .. { pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1 delay(250); } na: if (digitalRead(33) == LOW) //pin buttonMenu { // pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1 pokazMenu = 1; //obsluga 1 przyciskiem, i ostatnia strona powrot do glownego programu delay(250); } i nasłuchujemy ten sam button dla zmiany stron int reading = digitalRead(buttonMenu); // obsluga jednym klawiszem do menu if (reading != lastButtonState) { Wstawiony film to prezentacja działania z osobnymi klawiszami do wejscia/wyjscia menu i osobnego do zmiany stron. vid-20191028-menuLED7seg.zip
  6. Dodana kolejna funkcjonalność, dla zmiany parametrów dla danej zakładki / CASE i wyświetlenie parametrów zmiennej po zmianie. Aby uzyskać te udogodnienia należy zaraz po dodać następujący kod, /* deklarujemy z którego PINu ma być sygnał niski/LOW/0 oraz poprzez '&&' (warunek AND/ i) dodajemy WhichScreen, liczba 2 w tym wypadku mowi ze aby funkcja zadzialala MUSI byc atywna strona 2, dzieki temu dodane dzialania , funkcje, itp beda realizowane wylacznie dla tego okna, zapobiegajac przypadkowej edycji wartosci u mnie 'alarmHigh'. W innym wypadku bedac na stronie 3 niechcacy mozna by zmienic parametry alarmu */ if (digitalRead(31) == LOW && WhichScreen == 2) //pierwszy warunek dla wejscia PIN 31 = 0 i strony wyswietlanej 2 if (WhichScreen == 2) //drugi warunek wstawiony tylko dla pewnosci, bez niego podczas przeskakiwania miedzy funkcjami pomiaru i menu petla byla wykonywana { alarmHigh[1]++; //tutaj akurat podnosze o 1 wartosc alarmu, i zapisywane jest do tablicy hasChanged = true; // odswierza dana strone na ktorej sa wprowadzane zmiany poprawiajac wyswietlanie zmiennych } } Oczywiście dla wygody można użyć jednej tablicy do wszystkich stron, aby nie rozrastał się kod.. i tak oto pod zmienną s można przypisać numer strony wyświetlanej, oraz miejsce w tabeli.. No dobra, poniżej całkowity kod, z utworzoną tablicą dla parametrów każdej strony tabStrMenu[noleży_wpisać_ilosc_stron], Wykasowane nie potrzebne części kodu z testów. #include <TM1637Display.h> /* ! ! ! ! ! ! ! ! ! ! ! !! !! ! ! ! ! ! * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit * * ! ! ! ! ! !! ! ! ! ! ! ! !! ! * * This code create a MENU structure on a 16x2 LCD screen. * Six (6) different screens are implemented, and you can travel * thru them by pressing a button on Arduino PIN 4. Each press * of the button advances one (1) screen. * * Made by Clovis Fritzen in 05/06/2017 * http://www.FritzenMaker.com * http://www.FritzenLab.com.br */ #define CLK1 5 //wyswietlacz nr1 8segm.4-cz #define DIO1 6 //wyswietlacz nr1 8segm.4-cz int WhichScreen =1; // This variable stores the current Screen number boolean hasChanged = true; boolean pokazMenu = 0; const int buttonPin = 37; // the number of the pushbutton pin const int buttonMenu = 33; // wywolanie menu const int buttonOk = 32; // zatwierdz/zapisz key OK const int buttonUp = 31; // edycja key UP const int buttonDn = 30; // edycja key DOWN int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 75; // the debounce time; increase if the output flickers /* tabStrMenu - przechowywanie poszczegolnych ustawien dla kolejnych stron, 0 - niewykozystane, 1 - dla 1 strony czyli ALARM, 2 - przechowywany numer LINII; mozna tez przypisac do stron przez 's-1' w linii funkci menu */ int tabStrMenu[3]; // dane ze stron/menu LED // ilosc deklarowana = ilosc stron + 1; int value; //testowe TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637 uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; //Dla LEDDispl4digit //wyswietlenie segmentow dla AL const uint8_t disp_alarm[] = { SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G , // A SEG_D | SEG_E | SEG_F // L }; //wyswietlenie segmentow dla L const uint8_t disp_linia[] = { SEG_D | SEG_E | SEG_F ,// L 0 // O }; /* int test[2]; // tylko gdy potrzebuesz wartosci do Case */ void setup() { // lcd.init(); // initialize the lcd 0x20 lub 0x38?? // lcd.backlight(); // z LCD pinMode(buttonPin, INPUT_PULLUP); pinMode(buttonMenu, INPUT_PULLUP); pinMode(buttonUp, INPUT_PULLUP); pinMode(buttonDn, INPUT_PULLUP); display_1.setBrightness(0x0b); //LED7Seg jasnosc Serial.begin(9600); tabStrMenu[1]=33; //do testow domyslna wartosc dla alarmu, domyslnie pobierane z EEPROM tabStrMenu[2]=8; //domyslnie z eeprom - pobranie numeru linii WhichScreen =0; // aby menu startowalo od 1 str. } void loop() { int value = analogRead(2); // pomiar na analogowym wejsciu losowej Serial.print(F("Wejscie analogowe 2 ma wartosc: ")); // to na nic tu nie potrzebne Serial.println(value); /* test[1] = value; //zapis do tablicy potrzebny aby w CASE mozna bylo odczytac wartosc, po wrzuceniu do warunku na poczatku funkcji loop nie porzebne. */ if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to .. { pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1 delay(250); } // jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac if (pokazMenu == 0) { //GLOWNY PROGRAM display_1.showNumberDec(value); //info domslna strona a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego } else // jesli zmienna pokazMenu ma wartosc inna niz zero.. w tym wypadku tylko moze byc to 1 wykonaj.. wyswietlenie menu { int s = WhichScreen; // UWAGA! nalezy zadeklarowac tablice o liczbie elementow nie mniejszej niz ilosc stron. if (digitalRead(31) == LOW && WhichScreen == s) // zmiana parametrow UP/dodaj { Serial.print("strona nr :"); Serial.println(WhichScreen); if (WhichScreen == s) { tabStrMenu[s]++; hasChanged = true; delay (25); } } if (digitalRead(30) == LOW && WhichScreen == s) // zmiana parametrow DOWN/odejmij { if (WhichScreen == s) { tabStrMenu[s]--; hasChanged = true; delay(25); } } if (hasChanged == true) { switch(WhichScreen) { case 1: { firstScreen(); } break; case 2: { secondScreen(); } break; /* Dla wiekszej ilosci wyswietlania pozycji menu * case 3: { thirdScreen(); } break; case 4: { fourthScreen(); } break; case 5: { fifthScreen(); } break; case 6: { sixthScreen(); } break; */ case 0: //konczacy zapis menu { } break; } } //------------------------------- // BEGIN of the switch debouncing code int reading = digitalRead(buttonPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { hasChanged = true; WhichScreen++; } } else { hasChanged = false; } } lastButtonState = reading; // END of the switch Debouncing code // -------------------------------------- if (WhichScreen > 2){ //ilosc wszystkich stron WhichScreen = 1; } } } void firstScreen() // pierwsza strona opcji { display_1.clear(); //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu display_1.setSegments(disp_alarm, 2, 0); display_1.showNumberDec(tabStrMenu[1], false, 2, 2); //wyswietla graniczna temp. alarmu Serial.print("Alarm od:"); // test w serial Serial.println(tabStrMenu[1]); } void secondScreen() // druga str opcji itd itp { display_1.clear(); display_1.showNumberDecEx(tabStrMenu[2],0, true); // wartosc przechowywana dla Nr Linii display_1.setSegments(disp_linia, 2, 0); Serial.print("linia nr:"); // test w serial Serial.println(tabStrMenu[2]); } /* dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!! void fourthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("This is screen 4"); lcd.setCursor(0,1); lcd.print("Just press btn"); } void fifthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print(" Fifth screen"); lcd.setCursor(0,1); lcd.print("i2C LCD screen"); } void sixthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("THE last screen"); lcd.setCursor(0,1); lcd.print(" Sixth and last"); } */ Myślę że tyle wystarczy w temacie MENU dla 4-Digits Display LED
  7. Poprawiony kod... po dodaniu klawisza przełączającego zmienną pokazMenu na true/false, oraz warunku if..else uwzględniającego tą zmienną i powodującą wykonanie kodu dla programu właściwego .. np wyświetlanie wartości na wejściu analogowym (przy pokazMenu=0) lub kodu dla menu (pokazMenu=1). Domyślnie po starcie wartość zmiennej jest zapisana jako 0. #include <TM1637Display.h> /* Napisał: Szczepulek * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit * kod oryginalny dla cieklokrystalicznych https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu * Clovis Fritzen in 05/06/2017 */ #define CLK1 5 //wyswietlacz nr1 8segm.4-cz #define DIO1 6 //wyswietlacz nr1 8segm.4-cz int WhichScreen =1; // Nr strony przechowywany w zmiennej //This variable stores the current Screen number boolean hasChanged = true; boolean pokazMenu = 0; // zmienna do przelaczania miedzy menu a reszta programu const int buttonPin = 4; // PIN dla przycisku // the number of the pushbutton pin const int buttonMenu = 5; // wywolanie menu z przycisku do GND int buttonState; // status przycisku obecny - odczyt // the current reading from the input pin int lastButtonState = LOW; // poprzedni stan na przycisku unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637 uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; //Dla LEDDispl4digit //wyswietlenie segmentow dla AL const uint8_t disp_alarm[] = { SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G , // A SEG_D | SEG_E | SEG_F // L }; //wyswietlenie segmentow dla L const uint8_t disp_linia[] = { SEG_D | SEG_E | SEG_F ,// L 0 // O }; void setup() { pinMode(buttonPin, INPUT_PULLUP); pinMode(buttonMenu, INPUT_PULLUP); display_1.setBrightness(0x0a); //LED7Seg jasnosc Serial.begin(9600); WhichScreen = 0; //aby przy starcie zaczynało na pierwszej opcji menu } void loop() { int value = analogRead(2); // pomiar na analogowym wejsciu losowej if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to .. { delay(250); pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1 } /* pierwsza czesc programu , czyli robi co tam chcecie, pomiary, wyswietlanie w czasie rzeczywistym itp */ if (pokazMenu == 0) // jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac { display_1.showNumberDec(value); //info domslna strona a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego } /* no a tutaj juz sam kod do menu */ else { if (hasChanged == true) { //wykonanie menu wszystko w dol switch(WhichScreen) { case 1: { firstScreen(); } break; case 2: { secondScreen(); } break; case 3: { thirdScreen(); } break; /* Dla wiekszej ilosci wyswietlania pozycji menu * case 4: { fourthScreen(); } break; case 5: { fifthScreen(); } break; case 6: { sixthScreen(); } break; */ case 0: //konczacy zapis menu { } break; } } //------------------------------- // BEGIN of the switch debouncing code int reading = digitalRead(buttonPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { hasChanged = true; WhichScreen++; } } else { hasChanged = false; } } lastButtonState = reading; // END of the switch Debouncing code // -------------------------------------- if (WhichScreen > 3){ // UWAGA! jesli masz wiecej stron niz 3, musiasz zmienic warunek wpisujac wartosc rowna ilosci stron WhichScreen = 1; } } } void firstScreen() { display_1.clear(); Serial.println("glowny ekran"); // test w serial display_1.showNumberDec(99, false, 2, 2); } void secondScreen() { display_1.clear(); //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu int alarmHigh = 30; display_1.setSegments(disp_alarm, 2, 0); display_1.showNumberDec(alarmHigh, false, 2, 2); Serial.print("alarm:"); // test w serial Serial.println(alarmHigh); } void thirdScreen() { display_1.clear(); int liniaNr = 7; display_1.showNumberDecEx(liniaNr,0, true); display_1.setSegments(disp_linia, 2, 0); Serial.print("linia nr:"); // test w serial Serial.println(liniaNr); } /* //dla większej ilosci przejsc miedzy wyswietlanymi informacjami/stronami !!! void fourthScreen() { //tresc 4 strony } void fifthScreen() { //tresc 5 strony } void sixthScreen() { //tresc 6 strony } */
  8. Aktualizacja powyższego kodu, menu inicjowane osobnym klawiszem, i na nim przełączanie pomiędzy ustawieniami a wyświetlaniem na bieżąco jakichs tam parametrów, w tym wypadku do testu wartość na wejściu analogowym. #include <TM1637Display.h> /* ! ! ! ! ! ! ! ! ! ! ! !! !! ! ! ! ! ! * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit * * ! ! ! ! ! !! ! ! ! ! ! ! !! ! * * This code create a MENU structure on a 16x2 LCD screen. * Six (6) different screens are implemented, and you can travel * thru them by pressing a button on Arduino PIN 4. Each press * of the button advances one (1) screen. * * Made by Clovis Fritzen in 05/06/2017 * http://www.FritzenMaker.com * http://www.FritzenLab.com.br */ #define CLK1 5 //wyswietlacz nr1 8segm.4-cz #define DIO1 6 //wyswietlacz nr1 8segm.4-cz int WhichScreen =1; // This variable stores the current Screen number boolean hasChanged = true; boolean pokazMenu = 0; const int buttonPin = 37; // the number of the pushbutton pin const int buttonMenu = 33; // wywolanie menu int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 45; // the debounce time; increase if the output flickers int value; //testowe TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637 uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; //Dla LEDDispl4digit //wyswietlenie segmentow dla AL const uint8_t disp_alarm[] = { SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G , // A SEG_D | SEG_E | SEG_F // L }; //wyswietlenie segmentow dla L const uint8_t disp_linia[] = { SEG_D | SEG_E | SEG_F ,// L 0 // O }; const uint8_t disp_set[] = { SEG_A | SEG_C | SEG_D | SEG_F | SEG_G ,// S SEG_A | SEG_C | SEG_E | SEG_F | SEG_G , // E SEG_D | SEG_E | SEG_F | SEG_G }; int test[2]; void setup() { // lcd.init();// initialize the lcd 0x20 lub 0x38?? // lcd.backlight(); pinMode(buttonPin, INPUT_PULLUP); pinMode(buttonMenu, INPUT_PULLUP); display_1.setBrightness(0x0a); //LED7Seg Serial.begin(9600); WhichScreen = 0; //aby przy starcie zaczynało na pierwszej opcji menu } void loop() { int value = analogRead(2); // pomiar na analogowym wejsciu losowej Serial.print(F("Wejscie analogowe 2 ma wartosc: ")); // to na nic tu nie potrzebne Serial.println(value); test[1] = value; //zapis do tablicy potrzebny aby w CASE mozna bylo odczytac wartosc, po wrzuceniu do warunku na poczatku funkcji loop nie porzebne. Serial.println(test[1]); if (digitalRead(33) == LOW) // sprawdza czy na pinie 33 stan LOW niski, jesli tak to .. { delay(250); pokazMenu = !pokazMenu; // ..zmienia prawde logiczna w zmiennej typu boolean na przeciwna, czyli 1 na 0 lub 0 na 1 } if (pokazMenu == 0) // jesli (domyslnie na starcie) mamy 0 to wykonaj program, wlasciwy..czy tez ten ktory ma sie glownie wykonywac { display_1.showNumberDec(test[1]); //info domslna strona a raczej wyswietlacz, z w tym przypadku do testow wartoscia napiecia na analogowym pinie hasChanged = true; // ustawiam na true, aby po wlaczeniu na menu pojawila sie na wyswietlaczu strona ustawien, bez tego zostaje zamrozony wynik ostatniego pomiaru z wejscia analogowego } else // jesli zmienna pokazMenu ma wartosc inna niz zero.. w tym wypadku tylko moze byc to 1 wykonaj.. wyswietlenie menu { if (hasChanged == true) { switch(WhichScreen) { case 1: { firstScreen(); } break; case 2: { secondScreen(); } break; case 3: { thirdScreen(); } break; /* Dla wiekszej ilosci wyswietlania pozycji menu * case 4: { fourthScreen(); } break; case 5: { fifthScreen(); } break; case 6: { sixthScreen(); } break; */ case 0: //konczacy zapis menu { } break; } } //------------------------------- // BEGIN of the switch debouncing code int reading = digitalRead(buttonPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { hasChanged = true; WhichScreen++; } } else { hasChanged = false; } } lastButtonState = reading; // END of the switch Debouncing code // -------------------------------------- if (WhichScreen > 3){ WhichScreen = 1; } } } void firstScreen() // pierwsza strona opcji { display_1.clear(); Serial.println("glowny ekran"); // test w serial display_1.showNumberDec(1246); delete []test; } void secondScreen() // druga str opcji itd itp { display_1.clear(); //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu int alarmHigh = 30; display_1.setSegments(disp_alarm, 2, 0); display_1.showNumberDec(alarmHigh, false, 2, 2); Serial.print("alarm:"); // test w serial Serial.println(alarmHigh); } void thirdScreen() { display_1.clear(); int liniaNr = 7; display_1.showNumberDecEx(liniaNr,0, true); display_1.setSegments(disp_linia, 2, 0); Serial.print("linia nr:"); // test w serial Serial.println(liniaNr); } /* dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!! void fourthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("This is screen 4"); lcd.setCursor(0,1); lcd.print("Just press btn"); } void fifthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print(" Fifth screen"); lcd.setCursor(0,1); lcd.print("i2C LCD screen"); } void sixthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("THE last screen"); lcd.setCursor(0,1); lcd.print(" Sixth and last"); } */
  9. okej, nie jest to rozwiązanie satysfakcjonujące, jeśli ma byś statyczne wyświetlanie ok. W momencie gdy dodam np. int value = analogRead(2); Serial.print(F("Wejscie analogowe 2 ma wartosc: ")); Serial.println(value) w pętli loop. to będzie sobie wyświetlać serial w monitorze wartości, lecz wyswietlając w case1 (1 strona) te zmienna value, nie zmienia się, nie odświeża jej nawet po przeskoczeniu przez wszystkie strony. No to się pocieszyłem
  10. W osobnym temacie samo menu do wykorzystania z wyświetlaczami 7 segmentowymi, pozwala się przełączać pomiędzy kolejnymi "stronami" w pętli np.: 1 - 2 - 3 - 4 - 1 - 2 - 3 -... Button podpięty pod PIN w przykładzie 4 (INPUT_PULLUP) i zwierający z masą GND. #include <TM1637Display.h> /* Napisał: Szczepulek * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit * kod oryginalny dla cieklokrystalicznych https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu * Clovis Fritzen in 05/06/2017 */ #define CLK1 5 //wyswietlacz nr1 8segm.4-cz #define DIO1 6 //wyswietlacz nr1 8segm.4-cz int WhichScreen =1; // Nr strony przechowywany w zmiennej //This variable stores the current Screen number boolean hasChanged = true; const int buttonPin = 4; // PIN dla przycisku // the number of the pushbutton pin int buttonState; // status przycisku obecny - odczyt // the current reading from the input pin int lastButtonState = LOW; // poprzedni stan na przycisku unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637 uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; //Dla LEDDispl4digit //wyswietlenie segmentow dla AL const uint8_t disp_alarm[] = { SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G , // A SEG_D | SEG_E | SEG_F // L }; //wyswietlenie segmentow dla L const uint8_t disp_linia[] = { SEG_D | SEG_E | SEG_F ,// L 0 // O }; void setup() { pinMode(buttonPin, INPUT_PULLUP); display_1.setBrightness(0x0a); //LED7Seg jasnosc Serial.begin(9600); WhichScreen = 0; //aby przy starcie zaczynało na pierwszej opcji menu } void loop() { if (hasChanged == true) { switch(WhichScreen) { case 1: { firstScreen(); } break; case 2: { secondScreen(); } break; case 3: { thirdScreen(); } break; /* Dla wiekszej ilosci wyswietlania pozycji menu * case 4: { fourthScreen(); } break; case 5: { fifthScreen(); } break; case 6: { sixthScreen(); } break; */ case 0: //konczacy zapis menu { } break; } } //------------------------------- // BEGIN of the switch debouncing code int reading = digitalRead(buttonPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { hasChanged = true; WhichScreen++; } } else { hasChanged = false; } } lastButtonState = reading; // END of the switch Debouncing code // -------------------------------------- if (WhichScreen > 3){ // UWAGA! jesli masz wiecej stron niz 3, musiasz zmienic warunek wpisujac wartosc rowna ilosci stron WhichScreen = 1; } } void firstScreen() { display_1.clear(); Serial.println("glowny ekran"); // test w serial display_1.showNumberDec(99, false, 2, 2); } void secondScreen() { display_1.clear(); //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu int alarmHigh = 30; display_1.setSegments(disp_alarm, 2, 0); display_1.showNumberDec(alarmHigh, false, 2, 2); Serial.print("alarm:"); // test w serial Serial.println(alarmHigh); } void thirdScreen() { display_1.clear(); int liniaNr = 7; display_1.showNumberDecEx(liniaNr,0, true); display_1.setSegments(disp_linia, 2, 0); Serial.print("linia nr:"); // test w serial Serial.println(liniaNr); } /* dla większej ilosci przejsc miedzy wyswietlanymi informacjami/stronami !!! void fourthScreen() { //tresc 4 strony } void fifthScreen() { //tresc 5 strony } void sixthScreen() { //tresc 6 strony } */
  11. Menu dla 7 segmentowego wyświetlacza.. a no właśnie, nie wiem skąd wcześniej brało mi się 8 segmentowy może ze względu na kropkę występującą DP, ale mniejsza z tym, i tak wiemy o co chodzi.. W poszukiwaniu jakiegoś przykładu na tych wyświetlaczach, no ne znalazłem takowego.. (przykładu) Podjąłem się próby przekształcenia bardzo uproszczonego Menu dla LCD pod moje potrzeby.. i tak oto to wygląda: #include <TM1637Display.h> /* ! ! ! ! ! ! ! ! ! ! ! !! !! ! ! ! ! ! * UWAGA MODYFIKACJA KODU Z LCD NA LED 7 segmentowy 4-digit * * ! ! ! ! ! !! ! ! ! ! ! ! !! ! * * kod oryginalny https://github.com/FritzenLab/LCD-Screen-Menu-System/tree/master/LCD-Screen-Menu * * Made by Clovis Fritzen in 05/06/2017 * http://www.FritzenMaker.com * http://www.FritzenLab.com.br */ #define CLK1 5 //wyswietlacz nr1 8segm.4-cz #define DIO1 6 //wyswietlacz nr1 8segm.4-cz int WhichScreen =1; // This variable stores the current Screen number boolean hasChanged = true; const int buttonPin = 37; // the number of the pushbutton pin int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers TM1637Display display_1(CLK1, DIO1); // ustawienia wyjsc dla wyswietlacza na tm1637 uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; //Dla LEDDispl4digit //wyswietlenie segmentow dla AL const uint8_t disp_alarm[] = { SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G , // A SEG_D | SEG_E | SEG_F // L }; //wyswietlenie segmentow dla L const uint8_t disp_linia[] = { SEG_D | SEG_E | SEG_F ,// L 0 // O }; void setup() { // lcd.init();// initialize the lcd 0x20 lub 0x38?? // lcd.backlight(); pinMode(buttonPin, INPUT_PULLUP); display_1.setBrightness(0x0a); //LED7Seg Serial.begin(9600); WhichScreen = 0; //aby przy starcie zaczynało na pierwszej opcji menu } void loop() { if (hasChanged == true) { switch(WhichScreen) { case 1: { firstScreen(); } break; case 2: { secondScreen(); } break; case 3: { thirdScreen(); } break; /* Dla wiekszej ilosci wyswietlania pozycji menu * case 4: { fourthScreen(); } break; case 5: { fifthScreen(); } break; case 6: { sixthScreen(); } break; */ case 0: //konczacy zapis menu { } break; } } //------------------------------- // BEGIN of the switch debouncing code int reading = digitalRead(buttonPin); if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only toggle the LED if the new button state is HIGH if (buttonState == HIGH) { hasChanged = true; WhichScreen++; } } else { hasChanged = false; } } lastButtonState = reading; // END of the switch Debouncing code // -------------------------------------- if (WhichScreen > 3){ WhichScreen = 1; } } void firstScreen() { display_1.clear(); Serial.println("glowny ekran"); // test w serial display_1.showNumberDec(99, false, 2, 2); } void secondScreen() { display_1.clear(); //konieczne by nie nakladaly sie na siebie znaki/liczby z poprzedniego menu int alarmHigh = 30; display_1.setSegments(disp_alarm, 2, 0); display_1.showNumberDec(alarmHigh, false, 2, 2); Serial.print("alarm:"); // test w serial Serial.println(alarmHigh); } void thirdScreen() { display_1.clear(); int liniaNr = 7; display_1.showNumberDecEx(liniaNr,0, true); display_1.setSegments(disp_linia, 2, 0); Serial.print("linia nr:"); // test w serial Serial.println(liniaNr); } /* dla większej ilosci przejsc miedzy wyswietlanymi informacjami, ponizej rozpiska dla wyswietlacza LCD !!! void fourthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("This is screen 4"); lcd.setCursor(0,1); lcd.print("Just press btn"); } void fifthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print(" Fifth screen"); lcd.setCursor(0,1); lcd.print("i2C LCD screen"); } void sixthScreen() { lcd.clear(); lcd.setCursor(0,0); // Column, line lcd.print("THE last screen"); lcd.setCursor(0,1); lcd.print(" Sixth and last"); } */ Nie próbowałem jeszcze z integracją do mojego projektu. Button podpięty z: Pinem 37 - GND
  12. Niestety mam problem jak ugryźć MENU, ale na 4 cyfrowym wyświetlaczu LCD. Nie znalazłem w internetach czegoś takiego, na LCD tego mnóstwo. exit , dn, up , ok --klawisze podlaczone na jakichs tam pinach.. domyslnie wyswietlana temperatura [20*5] klik 'ok' >> - [AL:30] klik 'up' do drugiej opcji - [L 07] klik 'up'/ 'dn' przenosi ponownie do [AL:30] // 30 wartość pobrana z eeprom(alarmHigh,0) Będąc na [L 07] // 07 pobrane z eeprom(liniaNr,1) klik ok >> edycja numeru linii 'up' +1,' dn' -1 podczas wejscia do menu, po 5 sek nieaktywnosci powrot do wyswietlania temperatury. klik 'ok' >> zapis do eeprom (liniaNr,1) tak samo na pozycji AL edycja +/- 1. I zapis. po kliknieciu 'exit' PS.: tak tak, wiem.. wykorzystam już millis() a delay w odstawkę. Przynajmniej te w moim kodzie nie bibliotekach.
  13. Jeśli by mnie ktoś określił takim mianem kiepskiego programisty, bym sie nie obraził.. w końcu nie odbiega to od prawdy :D, za każdym razem jak spoglądam na kod, widzę nieścisłości.. i rzeczy które można lepiej sprawniej zrobić, zaglądając do bibliotek, faktycznie zauważyć można zapisy w kodzie które można usprawnić jeśli się ma wiedzę. Jak się ją ma.. to jak wspomniał RFM, pisze się samemu. Mi daleka droga do tego, co nie znaczy że nie będę próbował. Ważne że jakieś postępy robię, może nie koniecznie dobrą drogę obrałem.. to ja dziecku dać kalkulator, zamiast nauczyć tabliczki mnożenia.. no ale
  14. 60us !!! jesteś mistrz, wyższa półka programowania nie omieszkam zerknąć w temat odczytu licznika, @RFN jak zwykle twoje uwagi są bezcenne. Dzięki po raz kolejny.
  15. okej, siadłem dzisiaj na chwilę, problem miałem z prawidłowym połączeniem ze sobą (na razie) Arduino Mega 2560 z czujnikami i wyświetlaczami LED, jako nadajnik na serial'u, oraz Arduino Uno do odbioru na SoftwareSerial.h Pierwsza sprawa, oba moduły muszą być połączone masami (GND) by krzaczków nie było, druga sprawa logiczna ale łatwo coś przeoczyć.. prędkość musi być taka sama po obu stronach. Co do wieeeeeluuuuu poradników i przykładów, 99% ich nie działa lub jest niepełny opis/kod. Najwięcej pomógł mi opis: Niestety co do filmu "#100 jak przy użyciu komunikacji szerergowej połączyć dwa urządzenia [Arduino]" nie ma możliwości pobrania kodu źródłowego, nie aktualne linki. Ja przepisywałem kod z stop-klatki :D. Zmodyfikowałem i uprościłem pod siebie. Umieszczam poniżej kody źródłowe dla mega2560 jako nadajnik serial pomiarów, obsługujący cz.temp i wyświetlacze, oraz kolejna płytka to arduino uno jako odbiorca danych. Domyślnie ma być to ESP 8266-12E Kolego RFM dziękuje ci za pomoc, "na szybko" musiałem coś ustrugać by działało jako-tako. W wolnym czasie bez nacisku teraz zasiegnę do twoich rad by ulepszyć działanie całego układu, celowo nie pisze że tego kodu, wymagającego napisania od nowa. Zamieszczam ten kod by osoby jak ja początkujące, i nie mogące się połączyć po serialu nie błądziły po stronach bezwartościowych, lub poruszających temat bez łopatologicznego pokazania że to działa i dobrze odbiera dane. TX: /* SSS L K (2019) * S ZZZZ CCC ZZZZ EEE PPPP U U L EEE K K * SSS Z C Z E___ P P U U L E___ K K * S Z C Z E P P U U L E K K * SSSS ZZZZ CCC ZZZZ EEE PPPP UUU LL EEE K K * P * KOMUNIKACJA PO SERIALU (SOFTWARE) * Do komunikacji wykorzystano Nadawanie TX Arduino Mega 2560, odbior na Arduino Uno R3 * Na Mega 2560 uzyto Serial1, mozna uzyc serial2, czy serial3. Na Uno piny 2-oraz 3. * WAZNE !!! nie zapomnijcie polaczyc ze soba GND obu plytek. * u mnie dziala to dobrze. Przy nadawaniu temperatura jest zamieniana na liczbe calkowita bez przecinka/kropki poprzez * pomnozenie przez 100 wyniku pomiaru. By uniknac zmiany dlugosci wysylanych danych przy ujemnych temperaturach, * do wyniku dodaje 30 stopni, ktore przy pozniejszemu dekodowaniu na odbiorniku odejmuje (te 30st.), * Dzieki temu zabiegowi temperatura np 22.50 st.C, zamienione na calkowite ma wartosc 2250. a po dodaniu wczesniej * do pomiaru 30 ma wartosc 5250. I do wysylania potrzebne sa 4 bajty. * Bez tego wartosc -23.00 st.C po pomnozeniu ma wartosc -2300 czyli ze znakiem minusa mamy 5 bajtow. * Po dodaniu do pomiaru 30 st mamy 13 st (-23+30= 13) podsumowujac, minimalna temp przesylana bez bledu dekodowania/ * odczytu/ to temperatura -29.50, natomiast maksymalna to 69.50 (bo 70.00+ 30 = 100, po pomnozeniu przekracza 4 bajty) * Może i to rozwiązanie mocno AMATORSKIE, ale działa :) teraz można ulepszac kod i przeksztalcac.. */ // kod dla ARDUINO MEGA 2560 (4 x Serial) w trybie nadawania na Serial1 #include <DS18B20.h> #include <TM1637Display.h> #include <OneWire.h> #define ONE_WIRE_temp_in 2 //pin dla 1 czujnika ds18b20 #define ONE_WIRE_temp_out 3 //pin dla drugiego czujnika #define CLK1 5 //wyswietlacz nr1 8segm.4-cz dla wejscia powietrza - temp #define DIO1 6 //wyswietlacz nr1 8segm.4-cz #define CLK2 7 //wyswietlacz nr2 8segm.4-cz dla wyjscia powietrza - temp #define DIO2 8 //wyswietlacz nr2 8segm.4-cz TM1637Display display_1(CLK1, DIO1); TM1637Display display_2(CLK2, DIO2); OneWire oneWire_in(ONE_WIRE_temp_in); OneWire oneWire_out(ONE_WIRE_temp_out); DS18B20 sensor_airin(&oneWire_in); DS18B20 sensor_airout(&oneWire_out); byte address1[8]; byte address2[8]; uint8_t wysw1LED[] = { 0x00, 0x00, 0x00, 0x00 }; uint8_t wysw2LED[] = { 0x00, 0x00, 0x00, 0x00 }; // char wyslij[7]; //dzialalo.. String wyspom1 [9]; int i; /*/....usun..test int data [2]; int data1 [4]; int potPin = 0; // analog pin used to connect the potentiometer int pot0; // variable to read the pot0ue from the analog pin //...koniec */ void setup(void) { Serial.begin(9600); // s e r i a l 1 !!! Serial1.begin(9600); Serial.println("Nettigo DS18B20 lib - TwoPin_DS18B20"); //....test...ustDlaSerial3?? // pinMode(15, INPUT); // pinMode(14, OUTPUT); //.... display_1.setBrightness(0x0a); //jasnosc wysw nr 1 nizej 2 display_2.setBrightness(0x0a); // -||- sensor_airin.begin(9); sensor_airout.begin(9); oneWire_in.reset_search(); while(oneWire_in.search(address1)) { if (address1[0] != 0x28) continue; if (OneWire::crc8(address1, 7) != address1[7]) { Serial.println(F("1-Wire IN bus connection error!")); break; } } oneWire_out.reset_search(); while(oneWire_out.search(address2)) { if (address2[0] != 0x28) continue; if (OneWire::crc8(address2, 7) != address2[7]) { Serial.println(F("1-Wire OUT bus connection error!")); break; } } pinMode(40, OUTPUT); // czas trwania dla DS18b20 pinMode(44, OUTPUT); //czas trwania dla LED-wysw sensor_airin.request(); sensor_airout.request(); } void loop(void) { int airinCalkow; int airoutCalkow; int comTempIN; int comTempOut; Serial.print("Requesting temp..."); digitalWrite(40, HIGH); //start pomiaru odczytu DS18B20 if ( sensor_airin.available() ) { Serial.println(" done"); Serial.print("airin: "); float tempIn = sensor_airin.readTemperature(address1); Serial.println(tempIn); Serial.print("airout: "); float tempOut = sensor_airout.readTemperature(address2); Serial.println(tempOut); //wyswietla w serial monitor, ostatecznie bedzie usuniete digitalWrite(40, LOW); //koniec pomiaru odczytu i przeliczenia na calkowita liczbe airinCalkow = tempIn *100; //pozbycie sie kropki w wyniku pomiaru xx.xx airoutCalkow = tempOut *100; //podobnie dla drugiego pomiaru comTempIN = (tempIn+30)*100; //pozbycie sie kropki w wyniku pomiaru xx.xx comTempOut = (tempOut+30) *100; //podobnie dla drugiego pomiaru sensor_airin.request(); sensor_airout.request(); } //obsluga wyswietlania pierwszego wyswietlacza dla czujnika 1 ,szczegulna uwage nalezy zwrocic na prawidlowe odwolanie sie do uint, i display digitalWrite(44, HIGH); //start wyswietlanie wartosci na led_tm1637 if ( airinCalkow < -9900 || airinCalkow == 0) { wysw1LED[0] = (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G); // E wysw1LED[1] = (SEG_E | SEG_G); // r wysw1LED[2] = (SEG_E | SEG_G); // r wysw1LED[3] = display_1.encodeDigit(1); // 1 display_1.setSegments(wysw1LED); // Err1 } else { wysw1LED[0] = display_1.encodeDigit(airinCalkow/1000%10); //wyswietla cyfre dziesiatek z pomiaru cz.1 na wyswietlaczu pierwszym wysw1LED[1] = display_1.encodeDigit(airinCalkow/100%10); //wyswietla cyfre jednosci z pomiaru cz.1 na wyswietlaczu pierwszym wysw1LED[2] = (SEG_A | SEG_B | SEG_F | SEG_G); // znak stopni zamiast kropki ktore brak w wyswietlaczu ktory posiadam wysw1LED[3] = display_1.encodeDigit(airinCalkow/10%10); //pierwsza cyfra czesci dziesietnych display_1.setSegments(wysw1LED); // wyswietlenie temperatury na pierwszym wyswietlaczu } //obsluga wyswietlania drugiego wyswietlacza dla czujnika 2 if (airoutCalkow < -9999 || airoutCalkow == 0) { wysw2LED[0] = (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G); // E wysw2LED[1] = (SEG_E | SEG_G); // r wysw2LED[2] = (SEG_E | SEG_G); // r wysw2LED[3] = display_2.encodeDigit(2); // 2 display_2.setSegments(wysw2LED); // Err2 } else { wysw2LED[0] = display_2.encodeDigit(airoutCalkow/1000%10); //wyswietla cyfre dziesiatek z pomiaru cz.1 na wyswietlaczu pierwszym wysw2LED[1] = display_2.encodeDigit(airoutCalkow/100%10); //wyswietla cyfre jednosci z pomiaru cz.1 na wyswietlaczu pierwszym wysw2LED[2] = (SEG_A | SEG_B | SEG_F | SEG_G); // znak stopni zamiast kropki ktore brak w wyswietlaczu ktory posiadam wysw2LED[3] = display_2.encodeDigit(airoutCalkow/10%10); //pierwsza cyfra czesci dziesietnych display_2.setSegments(wysw2LED); // wyswietlenie temperatury na pierwszym wyswietlaczu } // uwaga.. zamiana ulamka na calkowite i przez dodanie do wyniku +29 pozbycie sie ewentualnego znaku MINUS char ti1=comTempIN/1000%10 + 48; //dodanie 48 by uzyskac znak typu char char ti2=comTempIN/100%10 + 48; char ti3=comTempIN/10%10 + 48; char to1=comTempOut/1000%10 + 48;// L_._ dziesiatki char to2=comTempOut/100%10 + 48;// _L._ jednosci char to3=comTempOut/10%10 + 48;// __.L cz.dziesietne // char wyslij[5]; // 7 zn digitalWrite(44, LOW); //koniec pomiaru wyswietlania na 2 szt modulu LED wyswietlacz tm1637 char wyspom1 [9]; //char wyspom2 [5]; //poszczegulne znaki w tabeli: wyspom1[0]=0x7B; //1 zn sprawdzajacy wyspom1[1]=ti1; wyspom1[2]=ti2; wyspom1[3]=ti3; wyspom1[4]='X'; //odziela t1 od t2 , czy tez TempIn od Out wyspom1[5]=to1; wyspom1[6]=to2; wyspom1[7]=to3; wyspom1[8]=0x7D; //2 zn sprawdzajacy Serial1.write(wyspom1, 9); Serial.println(wyspom1); //co wysyła?? //Serial1.write(comTempIN); Serial.println(comTempIN); delay(400); // delay in between reads for stability } Dla chcącego można użyć w kodzie sumy kontrolne , by profesjonalniej to działało. RX - odbiór /* SSS L K (2019) * S ZZZZ CCC ZZZZ EEE PPPP U U L EEE K K * SSS Z C Z E___ P P U U L E___ K K * S Z C Z E P P U U L E K K * SSSS ZZZZ CCC ZZZZ EEE PPPP UUU LL EEE K K * P * KOMUNIKACJA PO SERIALU (SOFTWARE) * Do komunikacji wykorzystano Nadawanie TX Arduino Mega 2560, odbior na Arduino Uno R3 * Na Mega 2560 uzyto Serial1, mozna uzyc serial2, czy serial3. Na Uno piny 2-oraz 3. * WAZNE !!! nie zapomnijcie polaczyc ze soba GND obu plytek. * u mnie dziala to dobrze. Przy nadawaniu temperatura jest zamieniana na liczbe calkowita bez przecinka/kropki poprzez * pomnozenie przez 100 wyniku pomiaru. By uniknac zmiany dlugosci wysylanych danych przy ujemnych temperaturach, * do wyniku dodaje 30 stopni, ktore przy pozniejszemu dekodowaniu na odbiorniku odejmuje (te 30st.), * Dzieki temu zabiegowi temperatura np 22.50 st.C, zamienione na calkowite ma wartosc 2250. a po dodaniu wczesniej * do pomiaru 30 ma wartosc 5250. I do wysylania potrzebne sa 4 bajty. * Bez tego wartosc -23.00 st.C po pomnozeniu ma wartosc -2300 czyli ze znakiem minusa mamy 5 bajtow. * Po dodaniu do pomiaru 30 st mamy 13 st (-23+30= 13) podsumowujac, minimalna temp przesylana bez bledu dekodowania/ * odczytu/ to temperatura -29.50, natomiast maksymalna to 69.50 (bo 70.00+ 30 = 100, po pomnozeniu przekracza 4 bajty) * Może i to rozwiązanie mocno AMATORSKIE, ale działa :) teraz można ulepszac kod i przeksztalcac.. */ // kod dla ARDUINO UNO w trybie odbioru Serial #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); //rx pin 2, tx pin 3 char buff[9]; //Initialized variable to store recieved data // bufor na odbierane dane, w moim przypadku 9 znaków do odbioru byte count; void setup () { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Start"); mySerial.begin(9600); //mySerial.println("mySerial_begin"); //wyswietla w serialu sprzętowym inicjalizacje serialu sprzętowego Serial.println("Start programu.."); } void loop() { while (mySerial.available()>0) { buff[0]=mySerial.read(); // if (buff[0]==0x7B) //sprawdza czy pierwszy bajt jest poprawny i jest to znak 0x7B (HEX) czyli "{" count=1; while (count<9) if (mySerial.available()>0) // jesli transmisja na serial software aktywna przechodzi dalej. { buff[count]=mySerial.read(); //odczyt z serial software count++; } if (count==9 && buff[8]==0x7D) // kontrola ostatniego bajtu/znaku (9 znak), w przypadku prawidłowego znaku kontynuacja { for (byte i=0;i<9;i++) //zapisujemy do tabeli buff kolejne znaki odebrane { Serial.print(buff[i]); Serial.print(","); } Serial.println(); float tempodczyt1 = (((buff[1]-48)*100)+((buff[2]-48)*10)+((buff[3]-48)+0.001))/10-30; Serial.println(tempodczyt1); float tempodczyt2 = (((buff[5]-48)*100)+((buff[6]-48)*10)+((buff[7]-48)+0.001))/10-30; Serial.println(tempodczyt2); } Serial.println("pauza pętli.."); delay (250); } } Mega ma za zadanie odbierać dane z czujnika, przetworzyć je i wysłać przez Serial do ESP modułu wi fi, który będzie czekał na transmisję i po 5 minutach za pomocą strony php dodawał temp do bazy danych. Mega także ma obsługiwać wyświetlanie temperatur. Dzięki takiemu połączeniu ESP i wykonanie na nim komunikacji z bazą nie będzie spowalniane przez termometry i tm1637 W monitorze serial odbierania : {,5,1,0,X,5,2,0,}, odebrane bajty 21.00 - po przeliczeniu na wartość mierzoną przez DS.
×
×
  • Utwórz nowe...