arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diodą

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
guzik121
Młodszy majsterkowicz
Posty: 44
Rejestracja: 10 wrz 2013, 17:51

arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diodą

Post autor: guzik121 » 1 lis 2013, 19:05

Witam Kolegów.
Wykorzystując cyfrowy czujnik/niki temperatury DS18B20 chciałbym żeby przy zadanej temperaturze zapały się odpowiednio zdefiniowane dioda (przekaźnik).

Znalazłem na stronie skrypt umożliwiający odczyt temperatury i działa.

Kod: Zaznacz cały

[i]#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures();
Serial.println("");
delay(500);
Serial.print("Czujnik-1: ");
Serial.println(sensors.getTempCByIndex(0));
}[/i]
Natomiast nie umiem zadać warunków zapalenia się diody.
Czy może mi ktoś podpowiedzieć jak uzupełnić ten kod by np. przy tem. 20 stopni pojawiał się stan HIGH na pinie 3 a po spadku tem. poniżej 20 stopni stna LOW.

Znalazłem w sieci kilka podobnych schematów ale wszystkie były oparte na analogowym czujniki temperatury a nie cyfrowym DS18B20

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


Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: Arturr300 » 1 lis 2013, 20:20

Proszę bardzo :)
2 ostatnie linijki to warunek

Kod: Zaznacz cały

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
#define pinDioda 3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
Serial.begin(9600);
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures();
Serial.println("");
delay(500);
Serial.print("Czujnik-1: ");
Serial.println(sensors.getTempCByIndex(0));

if(sensors.getTempCByIndex(0) >= 20) digitalWrite(pinDioda, HIGH);
else digitalWrite(pinDioda, LOW);
}
jaffar
Młodszy majsterkowicz
Posty: 43
Rejestracja: 10 sty 2013, 18:21

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: jaffar » 1 lis 2013, 20:34

(przekaźnik).
Jeżeli chcesz sterować przekaźnikiem to pamiętaj o diodzie prostowniczej równolegle do nóżek przekaźnika, bo w momencie wyłączania jest spory skok wyindukowanego napięcia i może ci spalić atmegę.
guzik121
Młodszy majsterkowicz
Posty: 44
Rejestracja: 10 wrz 2013, 17:51

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: guzik121 » 2 lis 2013, 11:08

Wszystkio działa idealnie :)

WIELKIE dzieki.
mj_2000
Młodszy majsterkowicz
Posty: 16
Rejestracja: 30 paź 2013, 16:43

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: mj_2000 » 18 lis 2013, 15:14

Bez problemu ten rezystor możesz dać przy płytce... teka konfiguracja staje się szczególnie oczywista w trybie "podkradania zasilania" (parasite power).
Szukasz pomocy przy projekcie na ARDUINO według Twojego pomysłu? KLIKNIJ TUTAJ!
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: cube » 18 lis 2013, 15:49

Myślę że można przyjąć zasadę że w małych urządzeniach rezystor umieszczamy na płytce. Przy dłuższych dystansach, lepiej położyć kabel 3-żyłowy i pullup zrobić przy czujniku, przy czym, w zależności od odległości, można próbować mniejsze rezystancje niż 5k. Na stronie maxim można znaleźć trochę informacji.
Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: hyena » 29 lis 2013, 02:01

MrLewerence pisze:Teoretycznie 1-wire działa do 30 metrów. Jednym krócej innym dłużej (nawet 100metrów bez rs485).
Jeśli mam powiedzmy linię 30-sto metrową...?
Jeśli Dallasa dam na 30 metrowym kablu to gdzie powinien być rezystor... przy kontrolerze czy przy sensorze?
O ile dobrze pamiętam to jedynym ograniczeniem jest pojemność lini, do bodajrze 400 pf. Więc jak zastosujemy przewód nisko pojemnościowy odległość może być znaczna.
misiek1811
Młodszy majsterkowicz
Posty: 14
Rejestracja: 2 gru 2013, 17:18
Kontakt:

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: misiek1811 » 2 gru 2013, 17:23

Witam Serdecznie
Nie wiem jak zrobić sterowanie dwiema diodami, jak będzie temp powyżej 0 to pali się czerwona dioda a jak spadnie poniżej 0 to niebieska, i jeszcze jak dodać dodatkowy czujnik żeby się wyświetlał na LCD

Kod: Zaznacz cały

#include <OneWireTempSensor.h>

#include <OneWire.h>
#include <LiquidCrystal.h>
#define pinDioda 9

int DS18S20_Pin = 7; //DS18S20 Signal pin on digital 7 by rahulmitra
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 7 by rahulmitra

void setup(void) {
Serial.begin(9600);
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.print("       Misiek");  
}

void loop(void) {
float temperature = getTemp();
Serial.println(temperature);
  lcd.setCursor(0, 1);
    lcd.print("Zew: ");
    lcd.print(temperature);
    lcd.print(" *C");
delay(100); //just here to slow down the output so it is easier to read

}

float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}



ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad


for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}

ds.reset_search();

byte MSB = data[1];
byte LSB = data[0];

float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;

return TemperatureSum;



}
misiek1811
Młodszy majsterkowicz
Posty: 14
Rejestracja: 2 gru 2013, 17:18
Kontakt:

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: misiek1811 » 2 gru 2013, 17:51

nie u mnie nie ma mrugania
misiek1811
Młodszy majsterkowicz
Posty: 14
Rejestracja: 2 gru 2013, 17:18
Kontakt:

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: misiek1811 » 3 gru 2013, 16:08

mam problem z zostającą literą C jak jest np 2.50 *C i temp spadnie do -1.00 *C i znowu wzrośnie to pojawia się 2.50 *CC, i jeszcze jak zrobić żeby można było wyświetlać temp min i max.
Pozdrawiam
skl
Majsterkowicz
Posty: 60
Rejestracja: 3 gru 2013, 17:37

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: skl » 3 gru 2013, 17:59

W każdym obrocie pętli czyść zawartość wyświetlacza (lcd.clear()), pozbędziesz się niechcianych znaków ;)

Kod: Zaznacz cały

void loop(void) {
float temperature = getTemp();
Serial.println(temperature);

lcd.clear();   // TA LINIA

  lcd.setCursor(0, 1);
    lcd.print("Zew: ");
    lcd.print(temperature);
    lcd.print(" *C");
delay(100); //just here to slow down the output so it is easier to read

}
Więcej informacji na stronie biblioteki: arduino.cc/en/Reference/LiquidCrystal

ewentualnie jak nie chcesz czyścić całego wyświetlacza to stwórz funkcję czyszczącą zadaną linijkę:

Kod: Zaznacz cały

void clear_line(int linia) {
lcd.setCursor(0, linia);
lcd.print("                            "); // tu sobie wstaw tyle spacji ile masz znaków w linii wyświetlacza

}
Pamiętaj tylko o zasięgu zmiennej lcd (u Ciebie globalny, więc ok. W innym przypadku trzeba by przekazywać ją do procedury)

// EDIT:
temperatura min i max ? Nic prostszego:
1. Tworzysz zmienne min i max (może być jako zmienne globalne). Zmienne tego samego typu co zmienna w której przechowujesz aktualną temperaturę.
2. Przy starcie uC przypisujesz odczytaną wartość temperatury jako min i jako max też (inicjacja zmiennych pierwszą wartością. Ewentualnie możesz przypisać jako minimalną najwyższą możliwą wartość, a maksymalnej najniższą możliwość wartość, tak żeby przy pierwszym odczycie mieć błędne wartości i je od razu zaktualizować).
3. Po każdym odczycie temperatury sprawdzasz :
a) czy odczytana wartość jest mniejsza od min. Jeżeli tak min=odczytana_temperatura
b) czy odczytana wartość jest większa od max. Jeżeli tak to max=odczytana_temperatura
4. Wyczyść linię wyświetlającą temp min i max.
5. Wypisz nowe wartości min i max

Kodu Ci nie napiszę :P

Pozdrawiam,
skl
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: Arturr300 » 3 gru 2013, 19:43

@MrLewerence
Mi wyświetlacz LCD migał, gdy podświetlenie podłączyłem bezpośrednio pod 5V. Gdy dałem opornik 2-8R lub potencjometr, te objawy ustąpiły.
Może u Ciebie jest tak samo?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1246
Rejestracja: 18 lis 2011, 02:18

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: Marhef » 3 gru 2013, 21:19

Mruga podświetlenie czy wyświetlany tekst?
Awatar użytkownika
rafalzaq
Majsterkowicz
Posty: 180
Rejestracja: 2 maja 2013, 23:57

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: rafalzaq » 3 gru 2013, 21:28

To chyba lepiej te spacje wykorzystać. Nie trzeba nawet całej linii wypełniać spacjami, a dodać tylko kilka za *C.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1246
Rejestracja: 18 lis 2011, 02:18

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: Marhef » 5 gru 2013, 00:28

A nie łatwiej "przesunąć" tekst w prawo? Tak, żeby *C było ciągle na tym samym miejscu, a na początku zostawić wolne miejsce (gdy temperatura odatnia) lub dać "-" dla ujemnej?
Miga przy każdym czyszczeniu ekranu. Chyba nic z tym nie zrobisz, zostaje "kasowanie" spacjami
skl
Majsterkowicz
Posty: 60
Rejestracja: 3 gru 2013, 17:37

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: skl » 6 gru 2013, 21:28

Moim zdaniem zadanie trudniejsze. Weź pod uwagę że raz możesz mieć temp jako 1 cyfrę, raz jako 2. Do tego minus lub bez i już jest rozbieżność. Łatwiej i nawet efektywniej kasować cały wiersz niż sprawdzać kilka warunków ile tych spacji dodać.

BTW:
ciekaw jestem czemu mruga. U mnie wszystko było okey, nawet jak backlight podpiąłem
guzik121
Młodszy majsterkowicz
Posty: 44
Rejestracja: 10 wrz 2013, 17:51

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: guzik121 » 9 gru 2013, 21:25

Witam.
Ja troszkę z innej beczki. Mianowicie często Arduino wyświetla wartości w formacie XX,XX. Długo szukałem jak zmniejszyć dokładność do jedność bez dziesiątych i setnych części wyniku.
Rozwiązanie okazało się bardzo proste.

Kod: Zaznacz cały

lcd.print(R, 0); //R to wyświetlana wartość
                    // liczba po "," określa ile cyfr ma być wyświetlanych po przecinku wartości R
Może komuś się przyda.

Pozdrawiam
misiek1811
Młodszy majsterkowicz
Posty: 14
Rejestracja: 2 gru 2013, 17:18
Kontakt:

Re: arduino - cyfrowy czujnik tem. DS18B20 i sterowanie diod

Post autor: misiek1811 » 25 sty 2014, 20:20

MrLewerence pisze:Przy tym kodzie nie ma efektu mrugania wyświetlacza?
tutaj masz 3 diody zapalane kolejno przy temperaturze 26, 27, 28 *C

Kod: Zaznacz cały

    edytowałem :p
Podasz mi kolego jeszcze raz ten kod na te 3 diody ?
ODPOWIEDZ

Strony partnerskie: