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