Skocz do zawartości

4 cyfrowy wyswietlacz + tmp 36


jarek84

Pomocna odpowiedź

Witam!

Jest to moj pierwszy post na tym forum i z gory szczerze przepraszam za brak odpowiedniej czcionki. Mam nadzieje, ze nie lamie regulaminu w tym miejscu. Mam windows 7 i przy instalacji nie wybralem naszej czcionki i teraz pojawily sie problemy przy probie zmiany.

Wykonuje pewien mniejszy projekt jako ''zadanie'' w ktorym mamy wyswietlic temperature na minimum 2 cyfrowym wyswietlaczu z multiplexem. Na poczatek chcialbym zaznaczyc ze 4 cyfrowy anodowy wyswietlacz jaki kupilem oraz czujnik temperatury tmp 36 sa prawidlowo podlaczone, gdyz testowalem podstawowy kod, gdzie wszystko dziala nalezycie.

Steruje anodami wyswietlacza przy uzyciu 4x2n3906 oraz rezystorow dla ochrony arduino.

Idea jest prosta ale czesc programistyczna przerasta moja wyobraznie. Otoz, chcialbym wyswietlic temperature z symbolem c na ostatniej ''cyfrze'', a przy przekroczeniu 30 stopni uaktywnic np migajaca diode.

Napisalem podstawowy kod, ktory jest bezsensownie dlugi i malo skuteczny, aczkolwiek dziala, wiec zalaczam probke ponizej. To jest tylko mala czesc kodu, ale z pewnoscia wystarczy zeby kazdy sie zorientowal jak wyglada cala reszta.

const int sensorPin = A2;// input pin 
double REF_VOLTAGE = 3.3;         

void setup() {

 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);

 pinMode(22, OUTPUT);
 pinMode(24, OUTPUT);
 pinMode(26, OUTPUT);
 pinMode(28, OUTPUT);

 Serial.begin(9600);
 analogReference(EXTERNAL);

}
void loop(){



   int sensorVal = analogRead(sensorPin);                             ;
   Serial.print("sensor Value: ");
   Serial.print(sensorVal); 
   float voltage = sensorVal * REF_VOLTAGE / 1024.0;
   Serial.print(", Volts: ");
   Serial.print(voltage);
   Serial.print(", degrees C: ");
   float temperature = (voltage -0.5) * 100;
   Serial.println(temperature);

if(temperature < baselineTemp  ){


   digitalWrite(9, 1);
   digitalWrite(8, 1);
   digitalWrite(7, 1);
   digitalWrite(6, 1);
   digitalWrite(5, 1);
   digitalWrite(4, 1);
   digitalWrite(3, 1);
   digitalWrite(2, 0); 

   digitalWrite(10, 0);  
   digitalWrite(11, 0);
   digitalWrite(12, 0);
   digitalWrite(13, 0);

delay (10);


   digitalWrite(9, 1);
   digitalWrite(8, 1);
   digitalWrite(7, 1);
   digitalWrite(6, 1);
   digitalWrite(5, 1);
   digitalWrite(4, 1);
   digitalWrite(3, 1);
   digitalWrite(2, 0); 
   digitalWrite(10, 0);
   digitalWrite(11, 0);
   digitalWrite(12, 0);
   digitalWrite(13, 0);

delay (10);
}
else if(temperature >= baselineTemp + 0.3 && temperature < baselineTemp + 0.7){

                                                        // wyswietla 20.50 stopni
   digitalWrite(9, 0);  
   digitalWrite(8, 0);
   digitalWrite(7, 1);
   digitalWrite(6, 0);
   digitalWrite(5, 0);
   digitalWrite(4, 1);
   digitalWrite(3, 0);                    // 2
   digitalWrite(2, 1); 
   digitalWrite(22, 0);
   digitalWrite(24, 1);
   digitalWrite(26, 1);
   digitalWrite(28, 1);

delay (10);


   digitalWrite(9, 0);
   digitalWrite(8, 0);
   digitalWrite(7, 0); 
   digitalWrite(6, 0);                     //  0
   digitalWrite(5, 0);
   digitalWrite(4, 0);
   digitalWrite(3, 1);
   digitalWrite(2, 0); 
   digitalWrite(22, 1);
   digitalWrite(24, 0);
   digitalWrite(26, 1);
   digitalWrite(28, 1);
delay (10);

   digitalWrite(9, 0);  
   digitalWrite(8, 1);
   digitalWrite(7, 0);
   digitalWrite(6, 0);                    //     5
   digitalWrite(5, 1);
   digitalWrite(4, 0);
   digitalWrite(3, 0);
   digitalWrite(2, 1); 
   digitalWrite(22, 1);
   digitalWrite(24, 1);
   digitalWrite(26, 0);
   digitalWrite(28, 1);

delay (10);


   digitalWrite(9, 0)
   digitalWrite(8, 0);
   digitalWrite(7, 0); 
   digitalWrite(6, 0);
   digitalWrite(5, 0);
   digitalWrite(4, 0);              //        0
   digitalWrite(3, 1);
   digitalWrite(2, 1); 
   digitalWrite(22, 1);
   digitalWrite(24, 1);
   digitalWrite(26, 1);
   digitalWrite(28, 0);

delay (10);

else if(temperature >= baselineTemp + 0.8 && temperature < baselineTemp + 1.2){
                                        //wyswietla 21 stopni

Kontynuowalem ten wzor az do odpowiednika 30 stopni i piszac skrotowo, to owszem temperatura sie wyswietla, ale jak widzicie kod jest bardzo oporny, szalenie dlugi i nie nadaje sie do realnych zastosowan. Chociarz, wytyczne w zadaniu sa spelnione, ale jestem bardzo srednio zadowolony z finalnego efektu.

Nastepnie, pozwolilem sobie przeszukac co tylko moglem w internecie napotykajac kilka podobnych projektow ktore mialy zblizony kod w wielu czesciach.

Chcialbym aby szanowni forumowicze mogli mi pomoc napisac program ktory wykorzystuje te same schematy zawarte w podanych linkach jak ponizej.

https://learn.digilentinc.com/Documents/329

http://www.lawicel.se/kod/arduino/FourDigitSevenSegment1.ino

Dotychczas jestem w miejscu gdzie musze wiedziec jak zastosowac funkcje case 1-9

int segA = 9; //Display pin 14
int segB = 8; //Display pin 16
int segC = 7; //Display pin 13
int segD = 6; //Display pin 3
int segE = 5; //Display pin 5
int segF = 4; //Display pin 11
int segG = 3; //Display pin 15
int segH = 2; //Display pin 15

double REF_VOLTAGE = 3.3;         // the reference voltage

const int sensorPin = A2;// input pin 

const int LEDpin = 10; // setting this pin as led connection

void setup() {       

//Setting up the pins of our seven-segment display to respond

pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);

pinMode(anode1, OUTPUT);
pinMode(anode2, OUTPUT);
pinMode(anode3, OUTPUT);
pinMode(anode4, OUTPUT);

pinMode(LEDpin, OUTPUT);

analogReference(EXTERNAL);

Serial.begin(9600);

void loop() { 

displayNumber(millis()/1000);

float temperature = getVoltage(sensorPin);                   
temperature = (temperature - .5) * 100;                      

Serial.print(", degrees C: ");                              
Serial.println(temperature);     
}


float getVoltage(int pin) 
{ 
 return (analogRead(pin) * .003222657);

}

Do tego momentu wszystko funkcjonuje tak jak powinno. Teraz chcialbym wykorzystac nastepujacy kod, ktory widzialem w kilku projektach gdzie wlasnie byl 4 cyfrowy wyswietlacz.

void showDigit(int digit, int decPoint) {
 switch (digit) {
   case 0:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, LOW);
     digitalWrite(segF, LOW);
     digitalWrite(segG, HIGH);
     break;
   case 1:
     digitalWrite(segA, HIGH);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, HIGH);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, HIGH);
     break;
   case 2:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, HIGH);
     digitalWrite(segD, LOW);
     digitalWrite(segE, LOW);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, LOW);
     break;
   case 3:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, LOW);
     break;
   case 4:
     digitalWrite(segA, HIGH);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, HIGH);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, LOW);
     digitalWrite(segG, LOW);
     break;
   case 5:
     digitalWrite(segA, LOW);
     digitalWrite(segB, HIGH);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, LOW);
     digitalWrite(segG, LOW);
     break;
   case 6:
     digitalWrite(segA, LOW);
     digitalWrite(segB, HIGH);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, LOW);
     digitalWrite(segF, LOW);
     digitalWrite(segG, LOW);
     break;
   case 7:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, HIGH);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, HIGH);
     break;
   case 8:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, LOW);
     digitalWrite(segF, LOW);
     digitalWrite(segG, LOW);
     break;
   case 9:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, LOW);
     digitalWrite(segG, LOW);
     break;
   default:  // All segments OFF
     digitalWrite(segA, HIGH);
     digitalWrite(segB, HIGH);
     digitalWrite(segC, HIGH);
     digitalWrite(segD, HIGH);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, HIGH);
     break;
 }

 if (decPoint) {
   digitalWrite(segDP, LOW);
 }
 else {
   digitalWrite(segDP, HIGH);
 }
}

void showNumber(int value, int decPoint) {
 int digit;
//
//  Loop through all 4 digits, starting at the LSD (Least Significant Digit)
//
 for (digit = 4; digit > 0; digit--) {
//
//  Turn OFF all 4 digits
//
   digitalWrite (dig1, HIGH);
   digitalWrite (dig2, HIGH);
   digitalWrite (dig3, HIGH);
   digitalWrite (dig4, HIGH);
//
//  Get out one digit (from right) from the number
//
   if (decPoint == digit) {
     showDigit((value % 10), 1);  // Show the Decimal Point
   }
   else {
     showDigit((value % 10), 0);  // Hide the Decimal Point
   }
   value = value / 10;
//
//  Turn ON the active digit for a short time
//
   switch(digit) {
     case 1:
       digitalWrite(dig1, LOW);
       break;
     case 2:
       digitalWrite(dig2, LOW);
       break;
     case 3:
       digitalWrite(dig3, LOW);
       break;
     case 4:
       digitalWrite(dig4, LOW);
       break;
   }
   delay(2);
 }
}

Bede szalenie wdzieczny jesli ktos rzuci swiatlo na moj problem i wytlumaczy jak wykorzystac te partie kodu:

void showDigit(int digit, int decPoint) {
 switch (digit) {
   case 0:
     digitalWrite(segA, LOW);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, LOW);
     digitalWrite(segE, LOW);
     digitalWrite(segF, LOW);
     digitalWrite(segG, HIGH);
     break;
   case 1:
     digitalWrite(segA, HIGH);
     digitalWrite(segB, LOW);
     digitalWrite(segC, LOW);
     digitalWrite(segD, HIGH);
     digitalWrite(segE, HIGH);
     digitalWrite(segF, HIGH);
     digitalWrite(segG, HIGH);
     break;

az do case9 

oraz 
switch(digit) {
     case 1:
       digitalWrite(dig1, LOW);
       break;
     case 2:
       digitalWrite(dig2, LOW);
       break;
     case 3:
       digitalWrite(dig3, LOW);
       break;
     case 4:
       digitalWrite(dig4, LOW);
       break;

Zalaczam rowniez zdjecie pokazujace obecny dzialajacy stan.

Oraz link - w razie problemow bede edytowal post, gdyz nie wiem ktory link jest prawidlowy.

https://www.forbot.pl/forum/upload_img/obrazki/IMG_58d2c4d33c3ea7985.jpg

Jestem bardziej niz pewny ze to optymalny sposob poniewaz wszystkie kody gdzie wystepowaly wyzej wspomniane linie kodu dzialaja u mnie bez zarzutu. Kod z komentarzami po angielsku musi byc napisany, a dla przejrzystosci usunalem wiekszosc.

Czy znalazlby sie ktos na szanownym forum z garscia informacji co do tego jak zmodyfikowac moj kod. Bede wdzieczny za jakakolwiek pomoc.

Link do komentarza
Share on other sites

Nie wiem jak Ci to delikatnie powiedzieć, ale to co pokazałeś jest w całości żałosne. Szkoda, że trafiłeś na takie przykłady i tak strasznie się z tym męczysz. Po prostu tego się tak nie robi. Ręce mi opadają, bo narobiłeś się, coś tam Ci nawet zaczęło działać i tylko szkoda tego Twojego czasu poświęconego na tak siłowe rozwiązanie. Nie krytykuję Ciebie - nie masz doświadczenia i nie umiesz oddzielić czegoś ciekawego od zwykłego chłamu. Szukasz jakichś kodów, kleisz, łączysz, wychodzi Frankenstein a przecież to nie koniec.

Ja tam również wielkim programistą nie jestem i pewnie nie mnie oceniać sensowność w ten sposób pisanych programów - każdy orze jak może i w końcu skoro działa, to lepiej w bebechy nie zaglądać. No, ale skoro pokazałeś to moja rada jest następująca: porzuć całkowicie to co zrobiłeś i zacznij od początku. Jeżeli nie wisi na Tobą jakiś bliski deadline a na dodatek masz to komuś pokazać do oceny(?) - zrób to porządnie, jak na mikrokontrolerze to się zrobić powinno, bo będzie wstyd jak diabli. Tak napisany kod w dorosłym świecie byłby bezpośrednim powodem wywalenia autora z roboty.

Nawet nie mam ochoty komentować tych dziesiątek linii kodu, bo błędy są w samych założeniach. Jeśli za chwilę nie dostaniesz porad "wprost" typu wklej to tu a tamto tam (albo linku do gotowca) i gdy nabierzesz ochoty na kilka linii ładnego kodu, daj znać. Nie będzie ani łatwo ani szybko, bo trzeba trochę poczytać i wchłonąć dawkę wiedzy o architekturze procesora który na płytce Arduino siedzi, ale wierz mi, opłaci się.

EDIT: I witamy na Forum, oczywiście. A z czcionką to nie wiem o co chodzi. U mnie wszystko wygląda OK. Co prawda Twój problem niewiele robota przypomina (a nawet jeszcze mniej) więc nie bardzo rozumiem, dlaczego wybrałeś akurat Forbota, ale może tytuł działu "Arduino" jest atraktorem silniejszym niż czarna dziura.

Link do komentarza
Share on other sites

W 100% musze sie z toba zgodzic. Przyznaje, ze po raz pierwszy mamy modul zwiazany z programowaniem w srodowisku arduino. Rok wczesniej mielismy absolutne podstawy jezyka 'c' , wiec to co robimy jest oparte o poziom raczkujacy i wszystkie projekty maja w zasadzie zachecic do dalszego poznawania mozliwosci arduino w miare przystepny sposob. Ogolnie to jest kierunek zwiazany z automatyka i elektronika w czystej formie. Wracajac do zadania, musze tutaj dodac, ze wymog jest w miare nisko ustawiony. Chcialbym to lepiej zrobic, ale ze wszystkich podobnych projektow, ktore sa w internecie, a dodam, ze jest ich duzo nie widzialem rozwiazan ciekawych, ktore moglbym w jakis sposob pozyczyc. Pamietajmy, ze to ma bazowac na podstawach i jakakolwiek modyfikacja w odpowiednia strone jest sukcesem. Nie szukam kodu, ze zdolnoscia przemyslowa, tylko porady. Doskonale rozumiem twoje zazenowanie widzac ten watek, bo to zupelnie naturalna reakcja. Mam swiadomosc, ze dla wielu programistow jest to wrecz obrazliwe. Wracajac do tematu, moge zaczac od poczatku, ale nie bede wiedzial w ktorym kierunku isc. Pozdrawiam

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

W filozofii Arduino piszemy jedynie prosty kod zapewniający główną funkcjonalność urządzenia. Wszystkie szczegóły implementacji pomniejszych zadań, a już tych związanych z obsługą peryferiów w szczególności, powinny być schowane w bibliotekach. Dzięki temu początkujący mogą skupić się na rdzeniu projektu bez wnikania "jak to działa". Nie popieram tej idei, ale faktem jest, że programy dla Arduino opierające się na gotowych bibliotekach powstają szybko i.. działają 🙂

Jeżeli chcesz zacząć od tego spsobu (a dlaczego by nie?) to weź pod uwagę bibliotekę SevenSeg, której opis masz tutaj:

http://sim.marebakken.com/SevenSeg.pdf

Możesz ją bez problemu ściągnąć i zainstalować w swoim środowisku. Odpalenie w niej wyświetlacza multipleksowanego to dwie linie kodu. Resztę załatwia "magia" biblioteki. Nie wiem czy o to Ci chodzi - bo jest to jednak przeciwległy biegun w stosunku do ręcznej rzeźby, którą zobaczyliśmy wcześniej.

Gdzieś po środku jest własna implementacja multipleksowania pokazująca i ucząca "jak to się robi", choć z uwagi na konieczność przyswojenia jednak jakiejś dawki wiedzy nie wiem, czy to dobry pomysł na tym etapie zaawansowania. Otwiera oczy i pokazuje jak wiele mikrokontrolery są w stanie zrobić, ale może "rozmienić" projekt na drobne. Poczytaj i coś wybierz. Wiem, że to niełatwe. Zrobienie czegoś samemu od podstaw korci, bo taka wiedza zostaje na długo, umożliwia samodzielny rozwój i bazowanie na niej w przyszłych projektach. Z drugiej strony jest to jednak wyważanie już otwartych drzwi. Jeśli kogoś nie bawią szczegóły implementacji, dzięki gotowej bibliotece może je z łatwością pominąć, szybko tworząc działający i spójny kod.

No tak, w sumie pytam chyba o to, czy wiążesz jakieś swoje plany z programowaniem systemów wbudowanych (lub czy Cię to po prostu bawi) - wtedy warto grzebać u podstaw, czy raczej jest to przystanek do zupełnie innej kariery. Nie musisz odpowiadać 🙂

Link do komentarza
Share on other sites

No tak, w sumie pytam chyba o to, czy wiążesz jakieś swoje plany z programowaniem systemów wbudowanych (lub czy Cię to po prostu bawi) - wtedy warto grzebać u podstaw, czy raczej jest to przystanek do zupełnie innej kariery. Nie musisz odpowiadać 🙂

Pytanie nie jest bardzo trudne, a problematyczne z punktu widzenia mojego wieku. Mysle, ze gdybym nie mial 32 lat zdecydowanie latwiej moglbym rozwazac ta sciezke rozwoju zawodowego. W zyciu mialem stycznosc z automatyka przemyslowa i stad pomysl ukonczenia kierunku tu w uk, aby ''poprawic mozliwosci''. Nigdy w zyciu nie poznalem inzynierow pracujacych przy mikrokontrolerach, czy tez jakichkolwiek innych - po namysle. Kilku znajomych z dawnych lat ukonczylo tego rodzaju studia w pl, ale nie mam rozeznania, gdzie sa jakie mozliwosci, bo tutaj strzelilo mi cale dorosle zycie... W arduino zrobilem juz kilka projektow, ktore ukonczylem i dzialaly dobrze z bibliotekami. Wbrew pozorom, porzadne wyswietlenie odczytow z sensora analogowego na 4 cyfrowym multipleksujacym wyswietlaczu jest trudne, tymbardziej ''rzezbiac'' kod od podstaw tak jak to ujales. Sama budowa i doprowadzenie do dzialania zajela mi 4 godziny:-) 36 polaczen na samym wyswietlaczu heh a na kodowanie to pewnie potrzeba tydzien lub dwa, zeby od podstaw dobry kod napisac. Arduino jest genialne, bo pomoglo mi zrozumiec jak dziala sterownik PLC, zrobilem nawet projekt w zeszlym roku zamieniajac je w sterownik dostosowany do pracy w 24 voltach.

Czlowiek chcialby robic ciekawe rzeczy w zyciu i czerpac z nich satysfakcje ale rynek pracy jest brutalny i mam jeszcze tylko 2 lata zeby wybrac to w czym chce ''siedziec'' w przyszlosci. Przynajmniej na studiach mam mozliwosc przetestowania sie w roznych dziedzinach inzynierii.

Bede probowal napisac ten kod i zobaczymy gdzie dojde na koncu.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.