Dziwne zachowanie LM35+LDC

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Wiru
Młodszy majsterkowicz
Posty: 25
Rejestracja: 16 mar 2014, 20:48

Dziwne zachowanie LM35+LDC

Post autor: Wiru » 12 sie 2014, 12:07

Witam, napisałem krótki program, ma on na celu wyświetlanie na LCD aktualnej temperatury. Wszystko działa dobrze, do czasu gdy nie odepnie się czujnika od układu. W tym momęcie nawet po ponownym wpięciu czujnika wyświetlają się jakieś absurdalne wartości. Czy to normalne zachowanie?

Kod: Zaznacz cały

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int TS1 = 0; // Volt Solar 

#define BACKLIGHT_PIN 3

LiquidCrystal_I2C lcd(0x27, 2,1,0,4,5,6,7);

void setup() {
  lcd.begin(16,4);
  lcd.setBacklightPin (BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight (HIGH);
 
  lcd.home();
  lcd.print("Solar");
  
  pinMode(7, OUTPUT);
  
}

void loop() 
{
  TS1 = analogRead(1)*500/1023;
  lcd.setCursor (0,1);
  lcd.print(TS1);
  lcd.setCursor (3,1);
  lcd.print("st. C");
  delay(200);
  
 if ( TS1 > 29 )
  {
    digitalWrite(7, HIGH);
    delay(100);
    digitalWrite(7, LOW);
    delay(100);
  }
}
@edit: Dodałem diodę do sprawdzania temperatury, wychodzi z tego, że wartość jest zmieniana tylko na LCD bo dioda miga. [edycja kodu]

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


Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Dziwne zachowanie LM35+LDC

Post autor: v-cu » 12 sie 2014, 14:22

Dzieje się tak chyba przez to że wyświetlacz masz podłączony przez przejściówke do magistrali I2C. Ona się chyba sama nie odświerza. Wyjmniesz czujnik,
włożysz spowrotem, klikasz reset i już. Jakbyś miał lcd podpięty normalnie to by problemu chyba nie było.
(MOGĘ SIĘ MYLIĆ)
Btw po co wyciągasz wgl tego lm'a?
Wiru
Młodszy majsterkowicz
Posty: 25
Rejestracja: 16 mar 2014, 20:48

Re: Dziwne zachowanie LM35+LDC

Post autor: Wiru » 15 wrz 2014, 17:46

Nie chciałem robić nowego tematu, więc bd kontynuował ten.
Jak kupiłe już I2C HD44780 to chciał bym go wykorzystać, chyba że w końcu spasuje i podepne milionem kabli..
W obecnej chwili mam jeszcze jeden problem, mianowicie gdy napięcie wyniesie więcej nić 0,31V zaczynają się dziać dziwne rzeczy pokazane w filmie.

Kod: Zaznacz cały

//#define T1 – czujnik temperatury na gorącym wyjściu kolektora słonecznego
//#define T2 – czujnik temperatury zimnej strony wężownicy bojlera 140l
//#define T3 – czujnik temperatury na gorącym wyjściu pieca CO
//#define T4 – czujnik średniej temperatury bojlera 60l
//#define T5 – czujnik na gorącym wyjściu bojlera 140l
#define P1 23 //– pompa cieczy solarnej
#define P2 25 //– pompa ładowania bojlera 140l
#define P3 27 //– pompa obiegowa doładowania bojlera 60l
#define MZ1 22 //– moto-zawór w obiegu kolektora słonecznego
#define MZ2 24 //– moto-zawór w obiegu pieca CO
#define MZ3 26 //- moto-zawór awaryjnego spuszczania cieczy solarnej

//--------------------------------------
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//----------------------------------
#define BACKLIGHT_PIN 3
//--------------------------------
LiquidCrystal_I2C lcd(0x27, 2,1,0,4,5,6,7);


void setup()
{
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(P3, OUTPUT);
  pinMode(MZ1, OUTPUT);
  pinMode(MZ2, OUTPUT);
  pinMode(MZ3, OUTPUT);

  //-----------------------------
  lcd.begin(16,4);
  lcd.setBacklightPin (BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight (HIGH);
  lcd.home();
  lcd.print("Solar System");
  
}
int T1 = 0;
int T2 = 0;
int T3 = 0;
int T4 = 0;
int T5 = 0;
int TA = 0;
int TB = 0;
int TC = 0;
int aTA = 0;
int aTB = 0;

void loop()
{
  T1 = analogRead(1)*500/1023;
  T2 = analogRead(2)*500/1023;
  T3 = analogRead(3)*500/1023;
  T4 = analogRead(4)*500/1023;
  T5 = analogRead(5)*500/1023;
  //----------------------
  TA = 10;
  TB = 10;
  TC = 10;
  aTA = 100;
  aTB = 100;
  delay (50);
    lcd.setCursor (0,1);
  lcd.print(T1);
  delay (50);
    lcd.setCursor (5,1);
  lcd.print(T2);
  delay (50);
    lcd.setCursor (10,1);
  lcd.print(T3);
  delay (50);
    lcd.setCursor (0,2);
  lcd.print(T4);
  delay (50);
    lcd.setCursor (5,2);
  lcd.print(T5);
delay (50);

  //------------------------Pompa wymiennicza
  if ( T5 <= T4 + 2)
  {
    digitalWrite(P3, LOW);
  }
  else if ( T5 > T4 + TC )
  {
    digitalWrite(P3, HIGH);
    delay(2000);
  }
 //--------------Zmiana koncepcji------------
 //--------------sterowanie P1------------
 {
 digitalWrite(P1, LOW);
 delay (200);
}
if (( T5 >= aTA ) && ( T1 >= T2 + TA ))
{
  digitalWrite(P1, HIGH);
} 
 else if (( T1 >= T2 + TA ) || ( T3 >= T2 + TB ))
 {
   digitalWrite(P1, HIGH);
 }
else if ( T1 <= T2 + 2 )
{
  digitalWrite(P1, LOW);
}
//--------------Sterowanie P2--------------
{
  digitalWrite(P1, LOW);
}
 if (( T5 >= aTA ) && ( T1 >= T2 + TA ))
 {
   digitalWrite(P2, HIGH);
 }
 else if (( T1 >= T2 + TA ) || ( T3 >= T2 + TB ))
 {
   digitalWrite(P2, HIGH);
 }
 else if (( T1 <= T2 +2 ) || ( T3 <= T2 +2 ))
 {
   digitalWrite(P2, LOW);
 }
 //-----------Sterowanie P3----------
 //-------Pompa wymiennicza alert-----------
 
 //-----------Sterowanie MZ1
 if (( T5 >= aTA ) && ( T1 >= T2 + TA ))
 {
   digitalWrite(MZ1, HIGH);
 }
 else if ( T1 >= T2 + TA ) 
 {
   digitalWrite(MZ1, HIGH);
 }
 else if ( T3 >= T2 + TB ) 
 {
   digitalWrite(MZ1, LOW);
 }
 //----------Sterowanie MZ2---------
 if (( T5 >= aTA ) && ( T1 >= T2 + TA ))
 {
   digitalWrite(MZ2, HIGH);
 }
 else if ( T3 >= T2 + TB ) 
 {
   digitalWrite(MZ2, HIGH);
 }
 else if ( T1 >= T2 + TA )
{
  digitalWrite(MZ2, LOW);
}
//-----------Sterowanie MZ3--------
if ( T1 >= aTA )
{
  digitalWrite(MZ3, HIGH);
  delay (50);
  digitalWrite(MZ3, LOW);
}
}
Kod do całego "systemu" powyżej (w obecnej chwili jestem w fazie eliminowania błędów :p jeśli macie jakieś uwagi to na pewno je przyjmę)
VvV FILM VvV
http://youtu.be/IU63l1Jz-Uo
przy jeszcze wyższych wartościach zaczynają wyskakiwać liczby 3'cyfrowe i po cofnięciu do wartości poniżej 0,30V dalej pokazuje głupoty. (mam nadzieje, ze film w miarę zrozumiały, nie zwracać uwagi na audio)

PS: Prosił bym o przeniesienie do "Problemy" bo tam to chyba bardziej pasuje.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Dziwne zachowanie LM35+LDC

Post autor: stiven » 15 wrz 2014, 17:49

Filmik jest prywatny, nie można obejrzeć.
Wiru
Młodszy majsterkowicz
Posty: 25
Rejestracja: 16 mar 2014, 20:48

Re: Dziwne zachowanie LM35+LDC

Post autor: Wiru » 15 wrz 2014, 17:57

Faktycznie, przepraszam najmocniej, z telefonu automatycznie ustawił sie prywatny, już poprawione :)

@edit: dorzucam jeszcze jeden film gdyby tamten był zbyt mało wyraźny/czytelny. (tutaj nawet wartość przy lekkiej zmianie z 0-11 zaczęła szaleć ale się uspokoiła, dlaczego? nie mam pojęcia..)
http://youtu.be/2WiVuTPYXLw
Chętnie odpowiem na wszelkie pytania. Jest to w sumie moja pierwsza zabawa z mikrokontolerami więc pewnie większość z was wybuchnie śmiechem patrząc na kod i moje problemy ale co poradzę :) :D
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Dziwne zachowanie LM35+LDC

Post autor: stiven » 15 wrz 2014, 18:10

Nie wiem czemu zaczyna potem tak dziwnie pokazywać, ale to, że później po zmniejszeniu temperatury jest dalej źle, to wynika z tego, że nie ma czyszczenia wyświetlacza. Jeśli wyskoczy trzecia cyfra, to ona tam już sobie zostanie jeśli nie ma czyszczenia.
Tak myślę, że może by pomogło zmienić typ danych do obliczania temperatury na float, bo to trochę wygląda na wyjście poza zakres integera, i wtedy już po obliczeniach zapisać do nowej zmiennej już jako integer.

EDIT
To jest na pewno wyjście poza zakres integera, skoro tam się pokazuje minus. Obliczenia zapisz do zmiennej float, potem jakoś przekopiuj do innej zmiennej, żeby mieć liczbę całkowitą.
Wiru
Młodszy majsterkowicz
Posty: 25
Rejestracja: 16 mar 2014, 20:48

Re: Dziwne zachowanie LM35+LDC

Post autor: Wiru » 15 wrz 2014, 18:29

Po zmienieniu wartości z int na float (bo o to chyba chodziło) zachodzi pewna bardzo ciekawa sprawa, mianowicie zakres po przekroczeniu wartości ~0,31V zostaje dodany znak minus i zaczyna rosnąć do 0 po czym znowu po jego osiągnięciu zaczyna rosnąć normalnie (znowu dodaje filmik bo on chyba najlepiej obrazuje problem) ale już jakiś krok w przód :)
http://youtu.be/na7wa9wTIkE

PS: nie wiem praktycznie czym różni się int od float, kiedyś na ten temat czytałem ale nie pojąłem zbyt wiele jak mówie like i samouk ze mnie :p
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Dziwne zachowanie LM35+LDC

Post autor: stiven » 15 wrz 2014, 21:35

Int to skrót od integer, co oznacza liczbę całkowitą. Float oznacza liczbę zmiennoprzecinkową, do zmiennej typu float można zapisać liczbę, która posiada coś po przecinku, na przykład 13,978, ale w programowaniu zamiast przecinka używa się kropki, czyli będzie to 13.978. Poza tym każdy typ danych ma pewien zakres. Na przykład char ma 256 możliwych wartości, od 0 do 255. Jak do 255 dodamy 1 na przykład, to nie będzie 256, tylko 0, bo przekroczony będzie zakres, dodając 2 do 255, będzie 1 itd. Int i float mają dużo większe zakresy, do tego jeszcze liczby ujemne.
Mam w domu lm35, kiedyś chciałem zrobić termometr na tym układzie, ale dopiero później zorientowałem się, że na arduino nie da się z lm35 uzyskać temperatur ujemnych, ponieważ napięcie wyjściowe też jest wtedy ujemne, a arduino "nie widzi" napięcia ujemnego. Zamieniłem wtedy lm35 na dallas 18ds20. Jest to układ cyfrowy i temperaturę "pokazuje" już w wersji cyfrowej, nie trzeba robić dodatkowych obliczeń.
Podłączyłem sobie teraz to lm35 i okazuje się że rzeczywiście, maksymalna temperatura to 31 stopni, zamiast 32 jest -31, tak jakby było wyjście poza zakres, nie ważne czy typ danych jest float, czy int. Jeszcze dziwna sprawa taka, że przy float powinno być coś jeszcze po przecinku, a nie tylko x.00(bo kiedyś ten układ testowałem i tak było). Spojrzałem tutaj: http://majsterkowo.pl/przenoszenie-prototypu-na-atmege/ bo wtedy jak ja pisałem program to z tego korzystałem i zauważyłem, że tam jest tak dziwnie napisane

Kod: Zaznacz cały

tempe = (5.0 * tempe * 100.0)/1024.0;
Okazuje się, że jak się dopisze ".0" to jest już okej. Może być tak jak ty masz T5 = analogRead(5)*500/1023 ale zmienione na T5 = analogRead(5)*500.0/1023.0. Nie wiem dlaczego, ale tak jest. A jak się ustawi zmienną na float, to są wtedy różne liczby po przecinku, a nie 00, czyli tak jak powinno być.
Wiru
Młodszy majsterkowicz
Posty: 25
Rejestracja: 16 mar 2014, 20:48

Re: Dziwne zachowanie LM35+LDC

Post autor: Wiru » 16 wrz 2014, 01:51

Dzięki ci panie :)
Po dodaniu .0 czyli " T5 = analogRead(5)*500.0/1023.0;" Wartości wyświetlają się poprawnie (względnie z małymi odchyłami ale margines błędu jest wiadomy) :D
Dziękuje pięknie za pomoc nie mam pojęcia co to dało ale działa :) Pewnie bd miał jeszcze trochę problemów bo cały system ma być dość ambitny ale temat wyświetlania temperatury na LCD został wyczerpany.
Oczywiście leci plusik dla ciebie :)
ODPOWIEDZ

Strony partnerskie: