Skocz do zawartości

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


Pomocna odpowiedź

Napisano (edytowany)

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
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 ;/

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
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 ; )

problem niestety występuje dalej, dziwne jest to ze normalnie po odczytaniu wartości jedna jest po przecinku a druga cała bez przecinka .

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 😉

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 ?

 

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.

 

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 .

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.

(edytowany)

@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

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...