Skocz do zawartości

Mini sterownik Terrarium, problem po pomiarze temperatur z 2 czujników ds18b20


Mrpatryk

Pomocna odpowiedź

Witam, mianowicie napisałem sobie kod + zrobiłem płytkę drukowaną do sterowania terrarium, wszystko śmiga pięknie jednak gdy włączę mate grzewczą (przekaźnik) w tedy włącza się pomiar temperatury na macie grzewczej czyli mam 2 pomiary z czujników  ds18b20 - wodoodpornych, niestety ale wypluwa mi w tedy jakieś cyfry randomowe (8 liczb,9liczb + znaczek temperatury)- błąd leży raczej gdzieś w sterowaniu ekranem bo odczyty z ds w porcie szeregowym są poprawne, ktoś cos ?

#include <DS3231.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <DS3231.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <Wire.h>
DS3231 clock;
RTCDateTime dt;
#define DHTPIN 4  
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);
unsigned long aktualnyCzas = 0;
unsigned long zapamietany1 = 0;
unsigned long zapamietany2 = 0;
unsigned long zapamietany= 0;



 int a; //drzwi
 int b=0; // menu
 int c;
 int d=1; //funkcja +1 all
 int e;
 int f;
 int g; //godz
 int H;
 int i=10; // sekunda
 int j=0; //minuta
 int k;
 int K;
 int t;
 int t1;
byte klucz[8] = {
	0b01110,
	0b10001,
	0b10001,
	0b01110,
	0b00100,
	0b00100,
	0b00100,
	0b00111
};
byte otwarte[8] = {
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000
};

byte kropla[8] = {
	0b00100,
	0b00100,
	0b01110,
	0b01110,
	0b11111,
	0b11111,
	0b11111,
	0b01110
};
byte stopnie[8] = {
	0b11000,
	0b11000,
	0b00000,
	0b00111,
	0b01100,
	0b01100,
	0b01100,
	0b00111
};
byte zraszanie[8] = {
	0b01010,
	0b00100,
	0b10001,
	0b01010,
	0b00100,
	0b10001,
	0b01010,
	0b00100
};
byte grzanie[8] = {
	0b00000,
	0b00000,
	0b10101,
	0b01110,
	0b11111,
	0b01110,
	0b10101,
	0b00000
};
byte mgla[8] = {
	0b10010,
	0b01001,
	0b10010,
	0b01001,
	0b10010,
	0b11111,
	0b11111,
	0b11111
};
byte swiatlo[8] = {
	0b00000,
	0b11000,
	0b11000,
	0b11000,
	0b11000,
	0b11111,
	0b11111,
	0b00000
}; 

 
 int czujnik = 2;   
 int czujnik1 = 3;
  
 int drzwi(){
  int war = digitalRead(czujnik); 
  int war1 = digitalRead(czujnik1);
  delay(1); 

  if (war == HIGH & war1 == HIGH) { 
    
    a= 1;
  }
 
  else { 
    
    a=2;
     }} 
 


void setup() {
digitalWrite(10, HIGH);
  lcd.begin(20,4);
  lcd.backlight();
  Serial.begin(9600);        
   
   lcd.createChar(0, klucz);
   lcd.createChar(1, otwarte);  
   lcd.createChar(2, kropla);
   lcd.createChar(3, stopnie); 
   lcd.createChar(4, zraszanie);
   lcd.createChar(5, grzanie); 
   lcd.createChar(6, mgla);
   lcd.createChar(7, swiatlo); 

pinMode(czujnik, INPUT);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(A3,INPUT);
pinMode(czujnik1, INPUT); 
dht.begin();
sensors.begin();
 clock.begin();
 

clock.setDateTime(__DATE__, __TIME__);}



void loop() {
  aktualnyCzas = millis();
  if (aktualnyCzas - zapamietany2 >= 5000UL) {sensors.requestTemperatures();zapamietany2 = aktualnyCzas;}
if (aktualnyCzas - zapamietany1 >= 2000UL) {

  float h = dht.readHumidity();
   zapamietany1 = aktualnyCzas;
   int adc_val = analogRead(A3);
 //  if (adc_val <= 500) {digitalWrite(11, LOW);} else if (adc_val >= 690) {digitalWrite(11, HIGH);}
   //Serial.println(adc_val);
}
if (aktualnyCzas - zapamietany2 >= 100UL) {

  drzwi();
  dt = clock.getDateTime();

if (a==1){
   lcd.setCursor(19,0);
  lcd.print((char)0);
  }else {
   lcd.setCursor(19,0);            
  lcd.print((char)1);}
   dt = clock.getDateTime();

float h = dht.readHumidity();
 // float t = dht.readTemperature();
int t= sensors.getTempCByIndex(1);
if (t>50){ lcd.clear();}
 if (isnan(t) || isnan(h)) {
 
  } else {
     lcd.setCursor(17,2);
  lcd.print(t,1);
  lcd.print((char)3);
  h=h-15;
   lcd.setCursor(17,4);            
  lcd.print(h,0);
  lcd.print((char)2);}
  g=dt.hour;

//menu:


if (b==0){ 

  lcd.setCursor(1,1);
if (dt.hour<=9) {lcd.setCursor(1,1);lcd.print(("0"));lcd.print((dt.hour));} else
  lcd.print((dt.hour));
  lcd.print(":");
  if (dt.minute<=9) {lcd.setCursor(4,1);lcd.print(("0"));lcd.print((dt.minute));} else
  lcd.print((dt.minute));
   }
   
 if (digitalRead(7) == LOW){delay(400); b++; }

 if (b==1){ lcd.setCursor(0,1);
  lcd.print("  Ustaw: ");

  lcd.print((char)3);
  lcd.setCursor(7,3);
  lcd.print(c);
  if (digitalRead(6) == LOW & b==1 ) {c=c+d;}
  if (c>=29){c=19;}
 if (digitalRead(5) == LOW & b==1 ) {c=c-d;}
 if (c<=19){c=19;}
  lcd.setCursor(7,3);
  lcd.print(c);
 }
 if (t<c ){digitalWrite(8, LOW);lcd.setCursor(18,0);            
  lcd.print((char)5);
   
 int t1 = sensors.getTempCByIndex(0);
 if (t1>50){ lcd.clear();}
lcd.setCursor(17,1);
  lcd.print(t1,1);
  lcd.print((char)3);
} else {digitalWrite(8, HIGH);lcd.setCursor(18,0);
  lcd.print((char)1);
  lcd.setCursor(14,1);
  lcd.print("      ");}





 if (digitalRead(7) == LOW){{b=b+d;}}
 delay(50);
if (b==2){ lcd.setCursor(0,1);
  lcd.print("  Ustaw: ");

  lcd.print((char)2);
  lcd.setCursor(7,3);
   lcd.print(e);
if (digitalRead(6) == LOW & b==2 ) {e=e+d;}
  if (e>=90){e=90;}
 if (digitalRead(5) == LOW & b==2 ) {e=e-d;}
 if (e<=50){e=50;}
lcd.setCursor(7,3);
   lcd.print(e);}
if (h<e ) {lcd.setCursor(17,0);
  lcd.print((char)6);digitalWrite(9, LOW);} else {lcd.setCursor(17,0);
  lcd.print((char)1);
  digitalWrite(9, HIGH);}







if (digitalRead(7) == LOW){{b=b+d;}}
 delay(50);
if (b==3){ lcd.setCursor(0,1);
  lcd.print("  Ustaw1: ");
  lcd.print((char)4);
 
if (digitalRead(6) == LOW & b==3 ) {f=f+d;}
  if (f==24){f=0;}
 if (digitalRead(5) == LOW & b==3) {f=f-d;}
 if (f<0){f=23;}
if (f<=9) {lcd.setCursor(7,3);lcd.print((char)1); lcd.print(f);} else{
 lcd.setCursor(7,3);
  lcd.print(f);}}
  if (a==1 & f==g & j==dt.minute & dt.second<=i ) {K=1;} else {K=0;}
  
  
 if (k==0){lcd.setCursor(16,0);
  lcd.print((char)1);
  digitalWrite(10, HIGH);}
 
   else  {lcd.setCursor(16,0);
  lcd.print((char)4);
  digitalWrite(10, LOW);}
  








if (digitalRead(7) == LOW){{b=b+d;}}
 delay(50);
if (b==4){ lcd.setCursor(0,1);
  lcd.print("  Ustaw2: ");
  lcd.print((char)4);
 
if (digitalRead(6) == LOW & b==4 ) {H=H+d;}
  if (H==24){H=0;}
 if (digitalRead(5) == LOW & b==4) {H=H-d;}
 if (H<0){H=23;}
if (H<=9) {lcd.setCursor(7,3);lcd.print((char)1); lcd.print(H);} else{
 lcd.setCursor(7,3);
  lcd.print(H); }}
  if (a==1 & H==g & j==dt.minute & dt.second<=i ){k=1;} else {k=0;}
  
  
  
 
 if (k==0)
 
 {lcd.setCursor(16,0);
  lcd.print((char)1);
  digitalWrite(10, HIGH);}
  else {lcd.setCursor(16,0);
  lcd.print((char)4);
  digitalWrite(10, LOW);}




 
 
 
 if (digitalRead(7) == LOW){{b=b+d;}}
 delay(50);
 if (b>=5){ lcd.setCursor(1,1);
  lcd.print("              ");
  lcd.setCursor(7,3);
   lcd.print("              ");
  b=0;}

//Serial.println(t2);

zapamietany2 = aktualnyCzas;



}}

 

Edytowano przez Mrpatryk
Link do komentarza
Share on other sites

3 minuty temu, farmaceuta napisał:

Co robi ten drugi argument? 

  lcd.print(t1,1);

Nie powinno być normalnie, czyli 

  lcd.print(t1);

 

wyświetla pełną cyfre, a nie cyfre po przecinku, jesli go nie dam to jeden czujnik pokazuje liczbe bez przecinka a drugi po przecinku, nie wiem od czego to jest zależne ;/

Link do komentarza
Share on other sites

1 minutę temu, Mrpatryk napisał:

wyświetla pełną cyfre, a nie cyfre po przecinku, jesli go nie dam to jeden czujnik pokazuje liczbe bez przecinka a drugi po przecinku, nie wiem od czego to jest zależne ;/

Przecież wartości z czujników zapisujesz do typu int, czyli liczby całkowite bez przecinków

  • Lubię! 1
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

Przed chwilą, farmaceuta napisał:

Przecież wartości z czujników zapisujesz do typu int, czyli liczby całkowite bez przecinków

W sumie tak, właśnie zmieniłem kod zaraz zobaczymy ; )

Link do komentarza
Share on other sites

Ja bym jednak proponował bliższy kontakt z funkcją sprintf - potrafi bardzo ułatwić życie (szczególnie jak się chce coś wyświetlić)... a i program się skraca jakoś tak ze trzy razy 😉

Link do komentarza
Share on other sites

kurcze dziwny problem jest w tym ze kiedys robilem projekt na kilku dallasach jednoczesnie z wyświetleniem parametrów i smigał, aktualnie po wlaczeniu przekaznika pokazują sie krzaki na LCD - bo pomiar w serialu pyka aż miło, czy jest mozliwosc jakiegos przebicia przez 230V  na przekazniku ?

 

Link do komentarza
Share on other sites

Przed chwilą, Mrpatryk napisał:

czy jest mozliwosc jakiegos przebicia przez 230V  na przekazniku ?

Teoretycznie nie, bo przekaźnik jest galwanicznym izolatorem. Prędzej obstawiam, że do LCD wysyłasz liczbę zamiast serii znaków 😄 To najprawdopodobniejsza przyczyna. Potem zła czcionka i walnięty moduł I2C.

Link do komentarza
Share on other sites

 

9 minut temu, ethanak napisał:

A takie glupie pytanie... rezystory podciągające na I2C są? Bo bez rezystorów to może działać, ale nie ma pewności.

rezystor 4k7ohm wrzucony jeden . bo dwa czujniki są do 1 pinu wrzucone .

Link do komentarza
Share on other sites

Przed chwilą, Mrpatryk napisał:

 

rezystor 4k7ohm wrzucony jeden . bo dwa czujniki są do 1 pinu wrzucone .

sorka pod i2c nie ma zadnego rezystora , na I2C mam wyświetlacz oraz zegar d3231.

Link do komentarza
Share on other sites

@Mrpatryk usuń cały ten kod i wyświetlaj tylko temperatury na LCD i się wyjaśni czy to błąd logiczny...druga sprawa co to ma robić? Bo jeszcze nie spotkałem takiego zapisu nigdy (wiem co to rzutowanie) 

  lcd.print((char)3)

I weź ten kod napisz poludzku, bo za takie formatowanie to napewno pójdziesz do piekła...😜 

Ps..po każdym wyświetleniu czegokolwiek musisz chyba odnowa ustawić kursor, a w wielu miejscach tego nie robisz..

Edytowano przez farmaceuta
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.