Arduino Polska Forum

Pełna wersja: DS18b20 i wyświetlacz segmentowy
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
[attachment=1416]Znalazłem taki oto projekt https://randomnerdtutorials.com/arduino-...7-segment/
Po wpisaniu kodu na wyswietlaczu pojawiły się tzw "śmieci" ,które bardzo szybko się przesuwają.Autor tego termometru zastosował u siebie czujnik DS 335Z a ja mam u siebie DS18b20 ,mam tez inny wyświetlacz segmentowy ,w projekcie był jeden 4 cyfrowy a ja mam 2 podwójne połączone ze soba .Próbuje przekształcić oryginalny skech na kod który bedzie czytał temperature z mojego ds18b20 i wyszło coś takiego. Po jego wgraniu wyswietlacz pokazuje temperature ale nie jest to stabilny odczyt ponieważ cyfry dalej dosyć szybko się przesuwają i dodatkowo odczyt wyświetlany jest od prawej strony.Kiedy wchodze w monitor szeregowy to tam temperatura jest pokazywana prawidłowo .Co zrobić aby wyswietlacz przestał mrugać a odczyt był od lewej strony chociażby z jednym miejscem po przecinku.Pomoże ktoś?
Na zdjeciu w taki sposób pokazuje 19 st.C
Kod:
/*
* Temperature Sensor Displayed on 4 Digit 7 segment common anode
* Created by Rui Santos, https://randomnerdtutorials.com
*/
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(A0); //Podłączenie do A0
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
const int digitPins[4] = {
  5,6,7,8};                 //4 common anode pins of the display
const int clockPin = 2;    //74HC595 Pin 11
const int latchPin = 3;    //74HC595 Pin 12
const int dataPin = 4;     //74HC595 Pin 14
const int tempPin = A0;     //temperature sensor pin
const byte digit[10] =      //seven segment digits in bits
{
  B00111111, //0
  B00000110, //1
  B01011011, //2
  B01001111, //3
  B01100110, //4
  B01101101, //5
  B01111101, //6
  B00000111, //7
  B01111111, //8
  B01101111  //9
};
int digitBuffer[4] = {
  0};
int digitScan = 0, flag=0,  soft_scaler = 0;
;
float tempK, tempC, tempF, temp;

void setup(void){ 
  Serial.begin(9600);
  sensors.begin(); //Inicjalizacja czujnikow             
  for(int i=0;i<4;i++)
  {
    pinMode(digitPins[i],OUTPUT);
  }
  pinMode(tempPin, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT); 
  pinMode(tempPin, INPUT);
}

//writes the temperature on display
void updateDisp(){
  for(byte j=0; j<4; j++) 
    digitalWrite(digitPins[j], LOW);

  digitalWrite(latchPin, LOW); 
  shiftOut(dataPin, clockPin, MSBFIRST, B11111111);
  digitalWrite(latchPin, HIGH);

  delayMicroseconds(0.1);
  digitalWrite(digitPins[digitScan], HIGH);

  digitalWrite(latchPin, LOW); 
  if(digitScan==2)
    shiftOut(dataPin, clockPin, MSBFIRST, ~(digit[digitBuffer[digitScan]] | B10000000)); //print the decimal point on the 3rd digit
  else
    shiftOut(dataPin, clockPin, MSBFIRST, ~digit[digitBuffer[digitScan]]);

  digitalWrite(latchPin, HIGH);
  digitScan++;
  if(digitScan>3) digitScan=0;
}

void loop(void){
// tempK = (((analogRead(tempPin)/ 1024.0) * 5.0) * 100.0); 
  //Converts Kelvin to Celsius minus 2.5 degrees error
// tempC = tempK - 273.0;  
// tempF = ((tempK - 2.5) * 9 / 5) - 459.67;
  //Celsius temperature display
 
//  tempC = int( sensors.requestTemperatures);
// sensors.requestTemperatures(); //Pobranie temperatury czujnika
  float tempC=sensors.getTempCByIndex(0);
  Serial.print("Aktualna temperatura: ");
  Serial.println(sensors.getTempCByIndex(0));
// Serial.print(tempC);
  digitBuffer[3] = int(tempC)/1000;
  digitBuffer[2] = (int(tempC)%1000)/100;
  digitBuffer[1] = (int(tempC)%100)/10;
  digitBuffer[0] = (int(tempC)%100)%10;
  updateDisp();
  delay(1);
Jest zasadnicza różnica pomiędzy wyświetlaczami dwu- i czterocyfrowymi. Zwykle te dwucyfrowe mają oddzielne wyprowadzenia każdej cyfry, a czterocyfrowe są multipleksowane. Można je więc inaczej sterować. Pozostaje rozróżnienie polaryzacji - wspólna anoda/wspólna katoda - też jest to różnica.
Jeśli masz dwa wyświetlacze 2 cyfrowe to możesz z nich zrobić odpowiednik takiego 4 cyfrowego multipleksowane, o ile polaryzacja się zgadza. Pokaż, jak połączyłeś wyświetlacze no i jakie to są wyświetlacze. Możesz sobie nieco uprościć kod, stosując wyświetlanie statyczne, bez multipleksowania, ale wtedy potrzebujesz w sumie 4 układy 595. 
Ewentualnie są dostępne na allegro niedrogie (ok 10zł) ośmiocyfrowe wyświetlacze ze sterownikiem MAX7219 - podłączasz zasilanie i 3 linie sterujące (lub SPI) i wysyłacz polecenia - samo wyświetlanie procka nie interesuje.

W oryginalnym projekcie segmenty są sterowane z 595 przez rezystory a cyfry są wybierane bezpośrednio z portów 4,5,6,7 modułu.
Wyświetlacze to DA-04 11HWA wspólna anoda.Jeden podwójny  wyswietlacz ma 2 anody a pozostałe piny to wyjscia segmentów wiec mam 4 anody (5,6,7,8 piny arduino) a wyjścia segmentów są ze sobą połączone tak jak w załączniku myślałem ze w ten sposób stworze 1 wyswietlacz 4 cyfrowy.Segmenty również mam podłączone przez rezystory.
Ten wyświetlacz średnio nadaje się do DS18B20, nawet jeśli poprawisz:
- nieprawidłową obsługę led, powinna być w przerwaniach co 10ms, by multipleksować każdą cyfrę 25Hz
- obsługę DS, po odkomentowaniu requestTemperatures zacznie mieć czkawkę bardzo widoczną, wyłącz waitforconverstion, potem naucz się mierzyć czas bez delay, zadbaj o to by odczyty były 1000ms po zleceniu pomiaru.
Bo i tak odczyt temperatury trwa ze 20ms, używając 335Z (literówka z LM?) masz odczyt analog trwający 100us, między odświeżeniem led możesz zrobić 100 pomiarów, wyciągnąć średnią.
Oczywiście mogę się mylić, bo widzę tylko fotkę zamiast kompletnego schematu.
Kup sobie ledy z TM1637.

Jak obniżysz oczekiwania to możesz się dalej bawić tym zestawem, na początek sprawdź czy ma dobrze podłączony wyświetlacz, masz delay 1, to sobie wywal wszystko od DS18B20, ustaw zmienną 1234, co 1000ms zmieniaj ją ++ i sprawdź czy dobrze wyświetla.
Docelowo miały być 3x taki wyswietlacz sterowany tranzystorami ;

https://sklep.avt.pl/pl/products/wyswiet...gKJlvD_BwE
ten który jest obecnie miał być tylko do sprawdzenia czy układ zadziała.
Mają dwie ręce i lutownice możesz sobie podłączyć do wybranego drivera led każdy led (no prawie, jak prąd za duży to faktycznie tranzystory jeszcze), różnica między obsługą przez uC a driver jest taka, że każdy segment cyfry musi być "cyknięty" na kilka ms co kilka ms. Jak masz driver to on to robi nieważne czym zajmuje się uC, jak podłączasz prosty rejestr przesuwny, to on wystuka na swoje piny co mu wyślesz, ale tylko raz, to zastępuje tylko piny uC, nie oszczędza mu czasu, w sumie trwa to dłużej, bo zaświecić segment portem AVR można w 50ns, ale wysłać to samo szeregowo softem to już sporo us. Jak masz 1 cyfrę, to możesz ją zaświecić na stałe, jak dwie to musisz co 20ms przeskoczyć i na jednym zaświecić 1 potem na drugim 9 i powtórzyć, jak masz 4 to by dalej oszukiwać oko trzeba skakać szybciej. Można na stałe zaświecić takie same cyfry na 4 modułach. Nie ma problemu by to robić, gdy uC robi to w przerwaniach Timera i biblioteki używane w pozostałej części kodu nie blokują przerwań. Akurat DS blokuje, bo sam ma 64 piłeczki do podrzucania w mikrosekundy i też chce mieć cały uC na czas komunikacji tylko dla siebie.
Nie ogarniesz tego umiejąc w kodzie zarządzać czasem z delay(1);
Znalazłem coś takiego ,wgrałem i działa tak jak chciałem Smile.Pozostaje jeszcze przerzucić to na większy LED.

Termometr DS18B20 z Arduino i 4-cyfrowym 7-segmentowym wyświetlaczem (how2electronics.com)
(29-01-2024, 21:49)kaczakat napisał(a): [ -> ]używając 335Z (literówka z LM?) masz odczyt analog trwający 100us

Nawet lepiej - przetwornik ADC jest sprzętowy, procek musi go tylko wystartować i za jakiś czas (przewidywalny) odczytać wynik. W tym czasie procek może robić inne rzeczy.
(29-01-2024, 21:55)gintur napisał(a): [ -> ]Docelowo miały być 3x taki wyswietlacz  sterowany tranzystorami ;

https://sklep.avt.pl/pl/products/wyswiet...gKJlvD_BwE
ten który jest obecnie miał być tylko do sprawdzenia czy układ zadziała.
Duże wyświetlacze LED mają segmenty zbudowane z kilku struktur LED połączonych szeregowo i wymagają większego napięcia, czasami ponad 5V.
No i jestem z powrotem  Smile.Problem dotyczy teraz wysterowania anod tych większych wyświetlaczy .Po złożeniu układu  na płytce stykowej tak jak na zdj. podłączyłem anody do stałego plusa.Segmenty odpaliły ale wszystkie na raz .Widać ,że coś tam sie cyfry zmieniaja ale żaden segment nie gaśnie.Znalazłem kilka schematów gdzie były wstawione tranzystory (ja dawałem BC 556 BC 547),że jeden PNP steruje drugim NPN u mnie nie zadziałało bo pewnie zle podłączyłem.Znalazłem coś takiego 
Duży wyświetlacz 7-segmentowy - elektroda.pl ale tam jest układ którego w sprzedazy nie widze.Kiedy miałem wszystko podłączone na płytce stykowej  z małymi wyswietlaczami ,wszystko działało ,był odczyt temperatury.Sprawdziłem napiecie na D5 D6 D7 i pokazało 0,6V a kiedy odłączyłem np jeden  segment to na tym pinie wzrosło do 1,2V... dlaczego tak  a nie 5V? Dochodzi jeszcze układ ULN 2803 ktróry miałbyć po to aby przepuścić wieksze prądy a tu okazuje się ,że jeszcze odwraca potencjały Confused.Pomoże ktoś z tymi anodami?
Stron: 1 2