Skocz do zawartości

wojtekq2

Użytkownicy
  • Zawartość

    4
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna
  • Zawód
    Technolog produkcji/Mechatronik
  • Moje zainteresowania:
    Arduino, projektowanie 3D, mikrokontrolery

Osiągnięcia użytkownika wojtekq2

Młodszy odkrywca

Młodszy odkrywca (3/19)

  • To już rok!
  • To już 5 lat!

Odznaki

0

Reputacja

  1. Miernik działa poprawnie 😉 uporałem się z nim. Kod dla miernika: #include <sevenSegmentDisplay.h> //do pobrania z github sevenSegmentDisplay name(COMMON_ANODE, 11,7,3,5,6,10,2,8); int a,b,c; int VCC=9; int VC1=13; int VC2=12; int odczytanaWartosc = 0; //Odczytana wartość z ADC float napiecie = 0; //Wartość przeliczona na napięcie w V #define op 2 //opóźnienie #define cz 4 //czas palenia się segmentów char tablica1[4]; void setup() { Serial.begin(9600); pinMode(VCC, OUTPUT); pinMode(VC1, OUTPUT); pinMode(VC2, OUTPUT); } void loop() { odczytanaWartosc = analogRead(A5); //Odczytujemy wartość napięcia napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie Serial.println(napiecie); //Wysyłamy zmierzone napięcie dtostrf(napiecie,4,2,tablica1); //konwersja float na tablice char for(int i=0; i<sizeof(tablica1); i++) { Serial.print(i); Serial.print("="); Serial.println(tablica1[i]); } a=tablica1[0]; b=tablica1[2]; c=tablica1[3]; a=a-48; b=b-48; c=c-48; int czas_oczekiwania = 40; while(czas_oczekiwania>=0){ name.set(a); digitalWrite(VCC, HIGH); delay(cz); digitalWrite(VCC, LOW); delay (op); name.set(b); digitalWrite(VC1, HIGH); delay(cz); digitalWrite(VC1, LOW); delay(op); name.set(c); digitalWrite(VC2, HIGH); delay(cz); digitalWrite(VC2, LOW); delay(op); czas_oczekiwania--; } } Próbowałem zrobić aby zamiana wartości z kodu Ascii wykonywała się w pętli for i wpisywała do tablicy sama, jednak coś nie gra. Moje leonardo się wieszało albo nie było żadnej reakcji. Kod obliczeń i wpisywania do tablicy int: char tablica1[4]; int tablicaliczb[4]; dtostrf(napiecie,4,2,tablica1); for(int i=0; i<sizeof(tablica1); i++) { for(int j = 0; j<sizeof(tablicaliczb); j++) { tablicaliczb[j]=tablica1[i]-48; } } Czemu tak się dzieje? Na monitorze portu szeregowego dla tablica1 dostawałem różne dziwne znaki. Jak powinienem poprawnie to zrobić? Dzięki Marek za pomoc, w sumie przy tym projekcie dużo się nauczyłem i nie uporał bym się z nim prawdopodobnie bez Twojej pomocy 😉 Pozdrawiam.
  2. Wypełniłem tablicę ciągiem znaków i wszystko się ładnie wyświetla na monitorze portu szeregowego : char tablica1[20]={'1','2','3','4','5','6','7','8','9',',','0','0','1','2','3','4'}; // tablica uzupełniona 16 znakami void setup() { Serial.begin(9600); } void loop() { for(int i=0; i<sizeof(tablica1); i++) { Serial.print(i); Serial.print("="); Serial.println(tablica1[i]); delay(500); } Serial.print("tablica="); Serial.println(tablica1); } 2) nie czytałem Mikołajka i nie wiem o co chodzi 😉 I funkcja dtostrf Zrobiłem tak jak pisałeś, przetestowałem tą funkcję, dla różnych wariantów i wnioski mam następujące: -jeśli zmienna float jest za duża to zostaje obcięta jej część całkowita i zaokrąglona w górę albo w dół, -dtostrf(liczba, 10, 2, bufor)- teraz liczba 10 to tak jakby "miejsca w tablicy na których jest wpisywana zmienna float i jeśli jest ona większa od tej zmiennej to w tablice są wpisywane puste pola i bufor tak będzie uzupełniany aby skończył się wpisywać na 10 miejscu w tablicy. Natomiast jeśli będzie na odwrót to ta sytuacja nie występuje, bufor się uzupełnia po kolei. Tutaj niestety muszę się przyznać, że nie rozumie dlaczego wyświetlacz nie reaguje jak wywołuje znak z tablicy. Wkleje jeszcze raz kod. Na monitorze portu szeregowego wszystko się ładnie wypisuje a wyświetlacz pokazuje tylko dwójkę wpisaną "ręcznie". #include <sevenSegmentDisplay.h> //do pobrania z github sevenSegmentDisplay name(COMMON_ANODE, 11,7,3,5,6,10,2,8); int VCC=12; int VC1=9; int VC2=13; //int odczytanaWartosc = 0; //Odczytana wartość z ADC float napiecie = 4.1234; //Wartość przeliczona na napięcie w V #define op 2 #define cz 4 char tablica1[5]; void setup() { Serial.begin(9600); pinMode(VCC, OUTPUT); pinMode(VC1, OUTPUT); pinMode(VC2, OUTPUT); } void loop() { //odczytanaWartosc = analogRead(A5); //Odczytujemy wartość napięcia //napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie //Serial.println(napiecie); //Wysyłamy zmierzone napięcie dtostrf(napiecie,5,3,tablica1); //konwersja float na tablice char for(int i=0; i<sizeof(tablica1); i++) { Serial.print(i); Serial.print("="); Serial.println(tablica1[i]); delay(100); } Serial.print("tablica="); Serial.println(tablica1); // Serial.println(tablica1[0]); //sprawdzenie na monitorze portu szeregowego int czas_oczekiwania = 100; while(czas_oczekiwania>=20){ name.set(tablica1[0]); digitalWrite(VCC, HIGH); delay(cz); digitalWrite(VCC, LOW); delay (op); name.set(tablica1[2]); digitalWrite(VC1, HIGH); delay(cz); digitalWrite(VC1, LOW); delay(op); name.set(2); digitalWrite(VC2, HIGH); delay(cz); digitalWrite(VC2, LOW); delay(op); czas_oczekiwania--; } delay(500); } 3)Dlaczego samodzielnie multipleksuje wyświetlacze- ponieważ dorwałem taki wyświetlacz ze starego dekodera SATELITY i postanowiłem że zrobię miernik napięcia w ramach ćwiczeń. Odnośnie czasów jakimi zapalam i gaszę poszczególne segmenty to znalazłem podobne w czyimś projekcie i tym się zasugerowałem. Jak powinny wyglądać one prawidłowo, np 2 milisekundy wyłączone i 4 zapalone?, niestety nie mam na tyle czasu aby wszystko wyczytać/ sprawdzić lub też znajdę takie a nie inne informacje i przyjmuje je za poprawne. Aczkolwiek wiem, że w Internetach jest dużo błędnych informacji. 4)Teraz podejrzewam, że najważniejsza kwestia, zmienna liczbowa przekonwertowana na typ char jest już zapisana w kodzie inaczej i program jej nie wyświetli ponieważ nie widzi jej poprawnie? Co powinienem zrobić, przekonwertować typ char poszczególnych elementów tablicy na typ np. int? Czy w ogóle mój tok myślenia jest błędny? 0x32 to 50 0x02 to 2
  3. dtostrf(napiecie,1,2,tablica1); Tu widzę, że wkradł mi się chochlik o którym już wiedziałem wcześniej, a nie jest powodem nie działania poprawnie programu. Poprawnie napisana funkcja: dtostrf(napiecie,4,2,tablica1); dtostrf-funkcja zamieniająca float na tablice char, napięcie - tutaj przekazuje właśnie zmienną która ma być przekonwertowana, 4 - nie jestem do końca pewien, ale ilość znaków które zawiera zmienna float, 2 - to jest ilość miejsc po przecinku do których zostanie obcięty float, tablica1 - tablica ciągu znaków do której chcę aby została zapisana zmienna napięcie, Na wyświetlaczu pokazuje: [0] - pierwszą wartość w tablicy, [2] - trzecią wartość w tablicy (pomijam separator liczby), cyfrę 2 wyświetlam w celu sprawdzenia czy wyświetlacz działa (bo nie wyświetlał nic z tablicy);
  4. Witam, Chciałbym się zwrócić do Was o pomoc w sprawdzeniu programu pod względem błędów. Mianowicie chcę zrobić miernik napięcia (od 0 do 5V) na arduino. Do tej pory mam wykonane połączenie i program który wgrywam do Arduino, jednak coś jest nie tak. Jak chce wyświetlić samą liczbę to nie mam z tym problemu, natomiast jak wykonam pomiar, przeliczę go na Volty, prze konwertuje zmienną za pomocą funkcji dtostrf na tablice znaków i teraz: jak wyświetlam na monitorze portu szeregowego który kol wiek znak tej tablicy wszystko ładnie pokazuje, a jak próbuje wyświetlić go na wyświetlaczu to brak reakcji (wyświetlacz niedziała). Czy moglibyście pomóc znaleźć mi błąd, ewentualnie powiedzieć co robię nie tak. Kod: #include <sevenSegmentDisplay.h> //do pobrania z github sevenSegmentDisplay name(COMMON_ANODE, 11,7,3,5,6,10,2,8); int VCC=12; int VC1=9; int VC2=13; int odczytanaWartosc = 0; //Odczytana wartość z ADC float napiecie = 0; //Wartość przeliczona na napięcie w V #define op 2 #define cz 2 char tablica1[4]; void setup() { Serial.begin(9600); pinMode(VCC, OUTPUT); pinMode(VC1, OUTPUT); pinMode(VC2, OUTPUT); } void loop() { odczytanaWartosc = analogRead(A5); //Odczytujemy wartość napięcia napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie Serial.println(napiecie); //Wysyłamy zmierzone napięcie dtostrf(napiecie,1,2,tablica1); //konwersja float na tablice char Serial.println(tablica1[0]); //sprawdzenie na monitorze portu szeregowego int czas_oczekiwania = 100; while(czas_oczekiwania>=20){ name.set(tablica1[0]); digitalWrite(VCC, HIGH); delay(cz); digitalWrite(VCC, LOW); delay (op); name.set(tablica1[2]); digitalWrite(VC1, HIGH); delay(cz); digitalWrite(VC1, LOW); delay(op); name.set(2); digitalWrite(VC2, HIGH); delay(cz); digitalWrite(VC2, LOW); delay(op); czas_oczekiwania--; } delay(500); }
×
×
  • 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.