Termometr z DS18B20 na 7-segmentowy wyświetlacz

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
[email protected]
Młodszy majsterkowicz
Posty: 3
Rejestracja: 8 cze 2014, 15:16

Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: [email protected] » 8 cze 2014, 15:23

Układ mam już zmontowany, problem polega na wyświetlaniu pomiaru, a jeszcze precyzyjnie, na pobraniu wyniku pomiaru z termometru. Mianowicie na czas pobrania, wyświetlacz 7-segmentowy gaśnie i zapala się po chwili z nowym wynikiem. Czy jest jakaś możliwość, żeby pozbyć się tej przerwy?

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


guzik121
Młodszy majsterkowicz
Posty: 44
Rejestracja: 10 wrz 2013, 17:51

Re: Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: guzik121 » 8 cze 2014, 15:44

Witam.

Pokaż kod wgrywany do Arduino.

Miałem podobny problem z migotaniem wyświetlacza LCD 16x4.
Rozwiązaniem było pozbycie się komendy "clear", która po każdej pętli czyściła wyświetlacz i to czyszczenie powodowało wyłączenie wyświetlacza na ułamek sekundy czyli mignięcie.
Pozdrawiam
[email protected]
Młodszy majsterkowicz
Posty: 3
Rejestracja: 8 cze 2014, 15:16

Re: Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: [email protected] » 8 cze 2014, 20:36

Rozwiązałem problem, trzeba było wykorzystać przerwania i obsługę timerów.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: stiven » 8 cze 2014, 21:29

Czy mógłbyś pokazać w jaki sposób to rozwiązałeś? Bo rozwiązałeś to programowo, ja żeby usunąć migotanie wykorzystałem rejestr przesuwny, ale to są dodatkowe układy.
[email protected]
Młodszy majsterkowicz
Posty: 3
Rejestracja: 8 cze 2014, 15:16

Re: Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: [email protected] » 9 cze 2014, 02:05

Przede wszystkim polecam Ci przeczytać projekt:
Zegar cyfrowy LED z bajerami – Część III: Przerwa na przerwania zegarowe.
Bardzo dobrze opisują problematykę przerwań dla ATmega328.

A tutaj kawałek kodu znajdujący się w funkcji setup:

Kod: Zaznacz cały

cli(); // zatrzymaj wykonywanie jakichkolwiek przerwań
 
  //Ustawienie przerwania co 1 Hz
  TCCR1A = 0;// zerowanie rejestru
  TCCR1B = 0;// zerowanie rejestru
  TCNT1  = 0;//rozpoczęcie zliczania timera od 0
    OCR1A = 15625;// ustawienie rejestru porównawczego na 1 Hz, wynika z obliczeń: = (16*10^6) / (1*1024) - 1 (must be <65536)
    TCCR1B |= (1 << WGM12);//uruchomienie trybu CTC
  
  TCCR1B |= (1 << CS12) | (1 << CS10);  //ustawienie preskalera na 1024
 
  TIMSK1 |= (1 << OCIE1A);// wskazanie dla jakiego rejestru przerwanie ma być wykonane
  
sei();//zezwalamy na wykonywanie przerwań 
I jeszcze przed funkcja Loop:

Kod: Zaznacz cały

ISR(TIMER2_ COMPA _vect) // usuń spacje przed i za compa, nie wiem czemu ale nie mogę inaczej wkleić bo mi     strona zarzuca że umieszczam linki o_0
{ 
  
  WYS(); //funkcja realizowana przez przerwanie
} 
Pozdrawiam
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Termometr z DS18B20 na 7-segmentowy wyświetlacz

Post autor: v-cu » 19 lis 2014, 22:13

Sory za mały odkop, ale mam taki sam problem a nie będę przecież nowego tematu zakładał.
Kod mam taki:

Kod: Zaznacz cały

#include "SevSeg.h"
#include <OneWire.h>
#include <DallasTemperature.h>
SevSeg sevseg;

#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
  Serial.begin(9600);
  sevseg.Begin(1,15,16,11,10,4,8,5,6,7,9,3,20);
  sensors.begin();
}

void loop()

{   
  sevseg.PrintOutput(); 
  sensors.requestTemperatures(); 
  sevseg.NewNum(sensors.getTempCByIndex(0),(byte) 2);
  Serial.println(sensors.getTempCByIndex(0));
  delay(1000);
}
No i działa to tak, jak kolega pisał wyżej. Gaśnie i wyświetla się z nowym wynikiem.

Tyle że ja używam do wyświetlacza biblioteki sevseg i nie wiem jak to rozwiązać :(

z czujnikiem lm35 działa dobrze.

Kod: Zaznacz cały

#include "SevSeg.h" 

SevSeg sevseg; 
int refreshTime = 1500; 
unsigned long timer; 
float celsius = 0;

void setup() 
{ 
sevseg.Begin(1,15,16,11,10,4,8,5,6,7,9,3,20); 
pinMode(13,OUTPUT);
} 

void loop() 
{ 
sevseg.PrintOutput(); 
celsius= (5.0 * analogRead(0) * 100.0) / 1024;
unsigned long mils=millis(); 
if (mils-timer>=refreshTime) { 
timer=mils; 
sevseg.NewNum(celsius,(byte) 2); 
} 
} 
Jak to teraz zrobić żeby działało z ds18b20 ?

Pozdrawiam.
ODPOWIEDZ

Strony partnerskie: