Przed chwilą napisałem komentarz, ale usunąłem, bo bzdury tam napisałem.
Nigdzie w internecie nie mogę znaleźć wykorzystania tej funkcji do wyświetlania zmiennej float. Wygląda na to, że chyba nie ma takiej możliwości, musi to być liczba całkowita (co też wskazuje na to nazwa funkcji) i do niej ustawia się maskę do wyświetlenia kropki.
Można spróbować zrobić coś takiego.
Kod: Zaznacz cały
int a_int; //dodatkowa zmienna int zadeklarowana przed setup(), chociaż ta akurat może być zadeklarowana w loop(), zamiast wcześniej
a_int = a * 10; //zamina wartości float na int, na przykład z 32,7 uzyskamy 327
tm1637a.showNumberDecEx(a_int, 32); //Display the Variable value; FAZA TESTÓW
a możliwe, że nawet można to skrócić, nie deklarować dodatkowej zmiennej i zrobić tylko coś takiego:
Kod: Zaznacz cały
tm1637a.showNumberDecEx(a * 10, 32); //Display the Variable value; FAZA TESTÓW
ewentualnie dodatkowo z rzutowaniem na int
Kod: Zaznacz cały
tm1637a.showNumberDecEx(int(a * 10), 32); //Display the Variable value; FAZA TESTÓW
hazi18 pisze: ↑13 gru 2019, 15:04
@Stiven Bibliotek ściągnięta z Github
Na githubie są różne wersje bibliotek do tego wyświetlacza o takiej samej nazwie. Bardziej chodziło mi o link, no ale już wiemy, że to jest ta, która ma możliwość zapalania kropek, więc już nie trzeba.
hazi18 pisze: ↑13 gru 2019, 15:04
@Marhef, Hexadecymalnie wyszło 32 z tego co widzę :)
To 32, to jest akurat wartość dziesiętna binarnej 0b00100000, heksadecymalna byłaby 20 i w programie zapisałoby się to jako 0x20.
hazi18 pisze: ↑13 gru 2019, 15:04
Poczytałem, pokombinowałem i kropkę mam ale nie potrafię przesunąć wartości do lewej strony, zeby po przecinku pokazywało mi liczbę dziesiętną.
użyłem
Kod: Zaznacz cały
void showNumberDec(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
i dałem go przed void setup.
Ta linijka nie jest w ogóle potrzebna w Twoim programie. Wszystko "dzieje się" w funkcji tm1637a.showNumberDecEx(), a tamta linijka tak naprawdę i tak jest dodawana do programu, bo załączasz bibliotekę. Każda załączona biblioteka jest jakby "wrzucana" w program w czasie kompilacji. A zauważ, że i tak dałeś deklarację funkcji showNumberDec(), a używamy teraz showNumberDecEx().
EDIT
Sprawdziłem u siebie jak działa program z dwoma przyciskami, dekrementującym i inkrementującym i to nie działa tak jak powinno. Te ify, które nie są jako else if (a z jakiegoś powodu nie mogą być, bo wtedy też program nie działa prawidłowo), trzeba zrobić jako jeden if.
Kod: Zaznacz cały
if (digitalRead(przycisk1) == HIGH)
{
krok = 1;
licznik = 0;
blokada = 0;
}
Kod: Zaznacz cały
if (digitalRead(przycisk2) == HIGH)
{
krok = 1;
licznik = 0;
blokada = 0;
}
zamienić na
Kod: Zaznacz cały
if (digitalRead(przycisk1) == HIGH && digitalRead(przycisk2) == HIGH)
{
krok = 1;
licznik = 0;
blokada = 0;
}
no chyba że pasuje Tobie jak tak szybko zmieniają się wartości przy naciśnięciu przycisku, ale wtedy cała ta idea licznika, kroku i blokady w ogóle nie działa jak są 2 osobne ify. Przy przyciskaniu danego przycisku, if od drugiego przycisku zmienia wartości tych trzech zmiennych, które są w ifie.
Jeśli chodzi o EEPROM, to ja zrobiłem coś takiego
Kod: Zaznacz cały
boolean eeprom = 0; //zadeklarowane przed setup()
unsigned long t_eeprom; //zadeklarowane przed setup()
if (digitalRead(przycisk2) == HIGH && digitalRead(przycisk1) == HIGH) //nowy wspólny if do obu przycisków zamiast dwóch osobnych wykrywający stan wysoki na wejściach od przycisków czyli wykrywanie puszczenia przycisków
{
if(licznik) //jeśli nastąpiło przyciśnięcie któregoś przycisku (poprzedni if będzie działać zawsze, jeśli nie jest wciśnięty żaden przycisk, a zmienna licznik większa od 0 będzie oznaczać, że rzeczywiście wcześniej nastąpiło przyciśnięcie któregoś przycisku {właściwie można dodać ten warunek do głównego ifa, a tu usunąć})
{
eeprom = 1; //ustawienie zmiennej do późniejszego zapisu do EEPROM
t_eeprom = millis(); //zapis czasu z millis() do zmiennej t_eeprom
}
krok = 1;
licznik = 0;
blokada = 0;
}
if(eeprom && (millis() > (t_eeprom + 10000))) //if wykona się jeśli zmienna eeprom ustawiona na 1 i minęło 10 sekund od puszczenia przycisku
{
eeprom = 0; //zerowanie zmiennej eeprom
Serial.println("tak"); //testowanie poprawności działania ifa, ma być to wyświetlone tylko 1 raz po 10 sekundach od ostatniego naciśnięcia przycisku
/*tutaj funkcja zapisująca do EEPROM*/
}
No i jeszcze do setup() dodać funkcję odczytu z EEPROM.
Funkcja odczytująca w setup() może wyglądać tak
Kod: Zaznacz cały
EEPROM.get(0, a); //odczyt wartości do zmiennej a z pamięci EEPROM zaczynająć od adresu 0
Funkcja zapisująca może wtedy wyglądać tak
Kod: Zaznacz cały
EEPROM.put(0, a); //zapis wartości ze zmiennej a do pamięci EEPROM zaczynająć od adresu 0
No i pamiętamy, że zapis do EEPROM musi być mocno ograniczony, czyli dodaj tę funkcję po wcześniejszym przetestowaniu poprawności działania ifa zapisującego.
Zmienna float zajmuje 4 bajty, czyli zaczynając od adresu 0, zapis będzie łącznie do 4 kolejnych komórek pamięci, więc zajęte będą komórki od 0 do 3.
Przy pierwszym uruchomieniu funkcja get odczyta wartość z EEPROM do zmiennej a, a jeszcze nie było wcześniejszego zapisu. Sprawdziłem u siebie co będzie odczytane. Wyświetlane jest nan, czyli brak wartości i potem nawet jak coś do tej zmiennej dodałem, to dalej było nan. Dlatego będziesz musiał raz dodać do setup() funkcję zapisu i zapisać tam tą wartość przypisaną do zmiennej a, wgrać program, a potem od razu usunąć ten zapis do EEPROM i wgrać program już bez zapisu w setup() a z odczytem.
No i jeszcze sprawa wersji Arduino IDE. Ja mam kilka wersji, stara wersja 1.0.5 nie posiada funkcji get() i put() dla pamięci EEPROM, no ale raczej posiadasz nowszą wersję.