Skocz do zawartości

Błąd pomiaru temperatury DS18b20 przy dwóch czujnikach przy sterowaniu przekaźnikami


boy_mackenzie

Pomocna odpowiedź

Witam. Mam dwie lodówki turystyczne, ale jedna jest na 230V druga na 12V. Postanowiłem opracować i wykonać projekt na Arduino UNO, przy programowaniu nie wystąpiły żadne wieksze problemy, jednakże gdy cały układ podłączyłem pod zasilanie 230V, Czujniki dallaski DS18b20 zaczęły świrować, raz mierzą i wyswietlają temperature, a za chwile -127, na zmiane jeden z drugim. Mógłby ktoś wskazać gdzie leży problem?

Sygnał na cewki przekaźników jest podawany z Arduino, czy problem jest z za dużym poborem prądu?

Poniżej wklejam kod z Arduino IDE.

#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(A5); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki

int P1230 = 8; //lodowka 230V
int P112 = 9;  //lodowka 12V
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

void setup()
{
   digitalWrite(P1230, HIGH);
    digitalWrite(P112, HIGH);
 
  Serial.begin(9600);
  sensors.begin(); //Inicjalizacja czujnikow
  pinMode(P1230, OUTPUT);
  pinMode(P112, OUTPUT);
  lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("REGULATOR"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print("LODOWKI"); //Wyświetlenie tekstu
  delay(2000);
  lcd.clear();
 
}


void loop ()
{
  sensors.requestTemperatures(); //Pobranie temperatury czujnika
  lcd.setCursor(0,0);
  lcd.print("T1=");
  lcd.setCursor(3,0);
  lcd.print(sensors.getTempCByIndex(0));  //Wyswietlenie informacji //230
  lcd.setCursor(13,0);
  lcd.print("230");
  lcd.setCursor(0,1);
  lcd.print("T2=");
  lcd.setCursor(3,1);
  lcd.print(sensors.getTempCByIndex(1));  //12
   lcd.setCursor(14,1);
  lcd.print("12");


 if((sensors.getTempCByIndex(0))>=8) {digitalWrite(P1230, LOW);
 
 
 
 } //ON

  if ((sensors.getTempCByIndex(0)) < 7)
   {
    digitalWrite(P1230, HIGH);
   }

if((sensors.getTempCByIndex(1))>=8) {digitalWrite(P112, LOW);} //ON

  if ((sensors.getTempCByIndex(1)) < 7)
   {
    digitalWrite(P112, HIGH);
   }

   
 
delay(5000);  
}

 

20210811_134142(1).jpg20210811_134142.jpg20210811_134145.jpg20210811_134157(1).jpg

20210811_134157.jpg20210811_134203.jpg20210811_134208.jpg20210811_134210.jpg

Edytowano przez Gieneq
Link do komentarza
Share on other sites

A jak długie kable masz do tych czujników? Jak zmniejszysz rezystancje rezystorów podciągających do 2.2k to jak się to zachowuje?
Masa i zasilanie idą bezpośrednio do płytki Arduino?
Napięcie zasilania czujników jest stabilizowane z tego samego stabilizatora co Arduino? 
Kondensatorki odsprzegające przy czujnikach są?
Jak nie podłączasz do ~230V wszystko działa?

Edytowano przez pmochocki
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

@boy_mackenzie  Tak w ramach ciekawostki, to co robisz da się zrobić w inny sposób. Dallasy mają 2 stałe które możesz sobie ustawić i służą jako alarmy - jeden alarm jest zgłaszany gdy temperatura spadnie poniżej progu, a drugi gdy wzrośnie powyżej progu. Myślę że to może być idealne miejsce do wykorzystania tej funkcji 🙂 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@Gieneq to bardzo fajny pomysł. Jednak w pierwszej kolejności trzeba wyjaśnić problemy z komunikacją z termometrami. Podejrzewam albo zakłócenia zasilania albo za długie kable, które może łapią jakieś zakłócenia. 

Link do komentarza
Share on other sites

Tak na marginesie: funkcja jest bardzo przydatna, ale wymaga skomunikowania się z ds-em. Więc może najpierw lepiej zająć się komunikacją, a potem funkcjami.

To tak, że najpierw trzeba znaleźć kawiarnię [1] a potem zastanawiać się jaką kawę [1] kupić.

---

[1] wszyscy wiedzą o co chodzi, ale mogą to czytać osoby niepełnoletnie

Link do komentarza
Share on other sites

A może to nie zakłócenia tylko zbyt mała wydajnoność stabilizatora... Wszystko idzie przez Arduino? Podświetlany wyświetlacz też przez Arduino zasilany? 

EDIT: Albo zasilacz, którym zasilasz płytkę Arduino. Może jest to zasilacz impulsowy i przez to zakłócenia. 

Edytowano przez pmochocki
Link do komentarza
Share on other sites

Nie przesadzaj - ds-y biorą jakieś miliampery, czyli wydajność zasilacza (o ile to nie jest jakaś paszcza) jest pomijalna

 Mam w domu taką prowizorkę, zasilanie z jakiejś wydobytej ze śmieci ładowarki od prehistorycznego galaxy, arduino pro mini, trzy przekaźniki, czujnik ruchu..

 i ta prowizorka działa już piąty rok.

Ale: ds-y mam podłączone zwykłym kablem telefonicznym, odległość od ostatniego jakieś 8m, próbowałem jeszcze jeden (dodatkowe 3m) i niestety, już nie działał

Link do komentarza
Share on other sites

Autor wątku milczy, więc tak się głośno zastanawiam. W dokumentacji do UNO mamy: The maximum current draw is approx 400mA. Wyświetlacz z podświetleniem może pociągnąć nawet 200mA. A na zdjęciach widać trochę więcej rzeczy, ale pewnie masz rację.

Jestem ciekaw czy 12V nie jest czasem brane stąd: image.thumb.png.2376a8a2cddaf7dcb20de4d043729c52.png i podawane na UNO. Może jakiś dławik i kondensatory na wejściu do UNO. Dodatkowo kondesantory odsprzedające na termometrach powinny pomóc.

 

Link do komentarza
Share on other sites

Nie znam tych arduinowych bibliotek ale czy po:

sensors.requestTemperatures(); //Pobranie temperatury czujnika

Nie trzeba nieco odczekać na zakończenie konwersji? Oraz czy:

lcd.print(sensors.getTempCByIndex(0));  //Wyswietlenie informacji //230

Zwraca jakąś wartość jeśli temp gotowa do odczytu lub że konwersja jeszcze trwa || jest błąd czujnika?

Link do komentarza
Share on other sites

11 minut temu, _LM_ napisał:

Nie trzeba nieco odczekać na zakończenie konwersji

To zależy od ustawienia fagi.

// sets the value of the waitForConversion flag
// TRUE : function requestTemperature() etc returns when conversion is ready
// FALSE: function requestTemperature() etc returns immediately (USE WITH CARE!!)
//        (1) programmer has to check if the needed delay has passed
//        (2) but the application can do meaningful things in that time
void DallasTemperature::setWaitForConversion(bool flag) {
	waitForConversion = flag;
}

Ale domyślnie jest ustawiona na true:

void DallasTemperature::setOneWire(OneWire* _oneWire) {

	_wire = _oneWire;
	devices = 0;
	ds18Count = 0;
	parasite = false;
	bitResolution = 9;
	waitForConversion = true;
	checkForConversion = true;
  autoSaveScratchPad = true;

}

 

 

Edytowano przez pmochocki
Link do komentarza
Share on other sites

No dobrze jeszcze jedno pytanko pomocnicze, skąd program "wie" który czujnik jest który, z ciekawości popatrzyłem jak to robią zawodowi arduinowcy heh. I tam to troszkę inaczej wygląda

EDIT tj rozumiem z grubsza działanie magistrali 1wire oraz to że każdy czujnik ma swój numer adres itd... Po prostu nie widzę tego (adresowania) w zaprezentowanym kodzie

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(A5); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki

int P1230 = 8; //lodowka 230V
int P112 = 9;  //lodowka 12V
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

Tak dla porządku, wpierw dolaczamy wszystkie #includy i #definy a potem zmienne, klasy i co tam jeszcze. 

Link do komentarza
Share on other sites

@pmochocki @ethanak Dobry pomysł nie jest zły 👍

Myślę że kod jest ok, problem to połączenie czujnika. DS wygląda na taki na kablu z metalową osłoną, jezeli pochodzi z ali to większa szansa że szwankuje sam z siebie. Mi w tych czujnikach nie działał pullup na linii, może potrzeba dodtkowy rezystor 4k7? Sam układ na płytce stykowej nie daje gwarancji stabilności pracy.

Może niech @boy_mackenzie się wypowie, bo na razie mamy świetną dyskusję, ale bez autora pytania, temat może robić się dość mętny 😞 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.