TERMOREGULATOR= lcd + DS18B20

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 4 wrz 2013, 11:22

Witam

Stworzyłem sobie termoregulator z przekaźnikiem który załącza\wyłącza uradzenie grzewcze przy zadanej temperaturze .
ale chce zmienić sposób wprowadzanie zadanej temperatury, teraz podaje ja bezpośrednio w kodzie ale chciałbym zęby były 2 przyciski powiedzmy + i - i nimi by się regulowało temperaturę. Ewentualnie mogę podesłać kod .Prośba o pomoc

wiem ze muszę wykorzysta coś takiego

pinMode(buttonPin, INPUT_PULLUP);


byte buttonState = digitalRead(buttonPin);

if(buttonState == LOW)
{
// przycisk wciśnięty i tu pytanie co trzeba podać zęby dodał +1 do zadanej temperatury
}
else
{
// przycisk puszczony
}

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


Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Janus » 4 wrz 2013, 15:27

Nie wiem w jakiej zmiennej trzymasz zadaną temperaturę, ale w przykładzie będzie to zmienna "zadanaTemperatura"

Kod: Zaznacz cały

if(buttonState1 == LOW)
{
zadanaTemperatura++;
}
if(buttonState2 == LOW)
{
zadanaTemperatura--;
}
Można jeszcze dodać ograniczenia żeby za bardzo nie podnieść i nie obniżyć temperatury
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: cube » 4 wrz 2013, 16:17

W pętli głównej powinno być tylko odczytanie temperatury, odczytanie stanu zadanego ze zmiennej,ustalenie stanu włączony/wyłączony grzałki (jeśli robisz bez pwm) lub wartość PWM (jeśli go stosujesz) i jakaś przerwa do następnego odczytu (lepiej wykorzystać bibliotekę Timers niż delay()).
Przycisk obsługujesz za pomocą przerwania

Kod: Zaznacz cały

attachInterrupt(bla,bla,bla, CHANGE)
W przerwaniu powinna być tylko opcja dodania/ujęcia wartości do zmiennej składującej wartość temperatury zadanej.
Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 4 wrz 2013, 17:26

dzięki wieczorem spróbuje coś z tym zrobić ewentualnie podrzucę cały kod
zelek93
Majsterkowicz
Posty: 96
Rejestracja: 27 sie 2013, 02:01

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: zelek93 » 4 wrz 2013, 18:51

Cześć, ja równie robię coś takiego, tylko zdecydowałem się na optotriak MOC3021 + triak bt138 zamiast przekaźników dedykowanych do arduino, ponieważ terrarium mam całkiem blisko miejsca gdzie śpię. Temperaturę można ustawić z dokładnością do +/- 0.25 stopnia.

A tutaj kod jakim to obsługuje, mało profesjonalny ale spełnia swoją role:

Kod: Zaznacz cały

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
int grzalka = 12;
int led = 9;
int p1 = 10;
int p2 = 11;
int p1state = 0;
int p2state = 0;
float tempe=30;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress;

void setup()   {
  
  pinMode(grzalka,OUTPUT);
  pinMode(p1, INPUT);   
  pinMode(p2, INPUT);   
  analogWrite(led, 220);
  display.begin();
  sensors.begin();
  display.setContrast(60);
  display.clearDisplay();
  delay(100);
}

void wys(void)
  {
  sensors.requestTemperatures();
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.println("temp:");
  display.setTextSize(2);
  display.setTextColor(BLACK);
  display.print(sensors.getTempCByIndex(0));
  display.print("*C");

  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.println("grzej do:");
  display.setTextSize(2);
  display.setTextColor(BLACK);
  display.print(tempe);
  display.print("*C");
 
   if (tempe>=sensors.getTempCByIndex(0))digitalWrite(grzalka,HIGH);
   else  {
           digitalWrite(grzalka,LOW);
          display.display();
          }
void loop() 
  {
  display.clearDisplay();
  p1state = digitalRead(p1);
  p2state = digitalRead(p2);
  if(p1state == HIGH){tempe=tempe+0.25;}
  if(p2state == HIGH){tempe=tempe-0.25;}
  wys();
}
Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 4 wrz 2013, 21:08

mój jest chyba bardziej ubogi;] ale tez spełnia swoje zadanie i jak wstawić te 2 przyciski

Kod: Zaznacz cały

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define ONE_WIRE_BUS A0

 OneWire oneWire(ONE_WIRE_BUS);
 DallasTemperature sensors(&oneWire);
 int nastaw = 35; // ustaw temperature
 int przekaznik = 7; // pin przekaznik 
 
 
  
void setup(void)


{
 pinMode(przekaznik,OUTPUT);

 
  lcd.begin(16, 2);
   lcd.print("Regulator Temp:");
  sensors.begin();
  Serial.begin(9600);
}
 
 
void loop(void)
{

  
  
 sensors.requestTemperatures();
 lcd.setCursor(0, 2);
 lcd.print("T=");
 lcd.print(sensors.getTempCByIndex(0));
  lcd.print("    ");
 lcd.print("N=");
 lcd.print(nastaw);
 if (sensors.getTempCByIndex(0) < (nastaw)) {
		digitalWrite(7,HIGH);
	} else {
		digitalWrite(7,LOW);
	}
  
}


Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 4 wrz 2013, 21:19

tak to teraz wygląda , grzałkę na filmie symbolizuje dioda

www(kropka)youtube(kropka)com/watch?v=ALmJr10Y1es
zelek93
Majsterkowicz
Posty: 96
Rejestracja: 27 sie 2013, 02:01

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: zelek93 » 5 wrz 2013, 23:37

Na szybko napisane:

Kod: Zaznacz cały

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

int p1 = 8;
int p2 = 6;
int p1state = 0;
int p2state = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define ONE_WIRE_BUS A0

 OneWire oneWire(ONE_WIRE_BUS);
 DallasTemperature sensors(&oneWire);
 int nastaw = 35; // ustaw temperature
 int przekaznik = 7; // pin przekaznik 
 
 
  
void setup(void)


{
 pinMode(przekaznik,OUTPUT);

 
  lcd.begin(16, 2);
   lcd.print("Regulator Temp:");
  sensors.begin();
  Serial.begin(9600);
}
 
 void wys(void){
 sensors.requestTemperatures();
 lcd.setCursor(0, 2);
 lcd.print("T=");
 lcd.print(sensors.getTempCByIndex(0));
 lcd.print("    ");
 lcd.print("N=");
 lcd.print(nastaw);
 if (sensors.getTempCByIndex(0) < (nastaw)) {
      digitalWrite(7,HIGH);
   } else {
      digitalWrite(7,LOW);
   }
 }
void loop(void)
{
 p1state = digitalRead(p1);
  p2state = digitalRead(p2);
  if(p1state == HIGH){nastaw=nastaw+1;}
  if(p2state == HIGH){nastaw=nastaw-1;}
  wys();
  

  
}
Przyciski do portu 8 i 6 tak samo jak w przykłaadzie z Arduino IDE czyli rezystor 10K i powinno działać :)
Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 10 wrz 2013, 09:07

Witam ponownie program śmiga świetnie ale jest mały problem podczas załączania przekaźnika wykrzaczami się ekran led znaczy są dziwne znaczki itd myślę ze to jakieś zakłócenia zasilania przez usb trochę lepiej ale przez zasilacz masakra. Podobno wystarczy zastosować kondensator ale gdzie??
Awatar użytkownika
Marhef
Złota rączka
Posty: 1238
Rejestracja: 18 lis 2011, 02:18

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Marhef » 10 wrz 2013, 18:55

Jak sterujesz przekaźniki?
Czasami wystarczy szybka dioda pomiędzy zasilaniem cewki przekaźnika i masą.
Dabalwwy
Młodszy majsterkowicz
Posty: 41
Rejestracja: 4 wrz 2013, 11:10

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Dabalwwy » 10 wrz 2013, 21:18

Mam moduł przekaźnika z 3 pinami, 2 to oczywiście +5 i GND a 3-ci to sygnałowy podpięty pod pin 7 tak jak widać w kodzie wyżej
Awatar użytkownika
Marhef
Złota rączka
Posty: 1238
Rejestracja: 18 lis 2011, 02:18

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Marhef » 11 wrz 2013, 19:14

Jakie elmenty masz na shieldzie z przekaźnikiem?
Dodaj kondensator 100nF na zasilaniu wyświetlacza (między Vcc i GND)
Ancur
Młodszy majsterkowicz
Posty: 2
Rejestracja: 5 gru 2013, 12:18

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Ancur » 12 gru 2013, 15:17

Witam wszystkich,

jestem tu nowa i mam nadzieje, że moje pytanie pasuje do tego tematu.

Mianowicie, staram się zrobić taki termoregulator. Wykorzystuję czujnik DS18B20 oraz LCD 16x2.

Chciałabym dwoma przyciskami +/- zmieniać wyświetlaną temperaturę. Może jest możliwość zapisania danych z czujnika do zmiennej, która wyświetlałaby się na LCD i którą można by zmieniać przyciskami.
Proszę o pomoc bo właśnie na tym etapie (podłączenia przycisków oraz możliwości zmiany temp za ich pomocą) utknęłam :)
W ten sposób odczytuję i wyświetlam temp.

float temperatur = 0;
char stringbuffer[ 17];

sensors.requestTemperatures(); // odpytanie czujnika i wyswietlenie wyniku pomiaru

Serial.println(sensors.getTempCByIndex(0));
lcd.setCursor(0, 2);
temperatur = sensors.getTempCByIndex(0);
lcd.print( dtostrf( temperatur, 5, 2, stringbuffer ) );
delay(15000);


Pozdrawiam.
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: cube » 12 gru 2013, 19:14

Chcesz zrobić termostat, dobrze się rozumiemy?
Rozwiązaniem na 90% problemów jest przerwanie czyli funkcja attachInterrupt(). Tworzysz nową zmienną na wartość oczekiwaną temperatury. W funkcji przerwania robisz funkcje powiększenia tej zmiennej, lub pomniejszenia, o zadaną wartość (pół stopnia, stopień). Potem porównujesz obie wartości, odczytu z czujnika i temp. zadanej i na podstawie wyniku równania włączasz lub wyłączasz grzałkę.
Klawiaturę możesz zrealizować na dwa sposoby, w zależności od tego czy masz wolne wejścia czy musisz oszczędzać. Wariant mniej oszczędny(3 wejścia): jedną parę styków każdego przycisku podłączasz do pinu przerwania, drugą drugi styk każdego przycisku do różnych wejść cyfrowych i w przerwaniu odczytujesz je oba i program zwiększa/zmniejsza wartość w zależności od wciśniętego przycisku.
Wariant oszczędny (2 wejścia): znów jedna para styków każdego przycisku do jednego pinu przerwania. Druga para poprzez dzielnik rezystorowy do wejścia analogowego.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: wojtekizk » 13 gru 2013, 13:51

Witam... Ancur w sumie kolega cube ma rację - przy nieskomplikowanych aplikacjach i małej ilości przycisków sterujących warto całe sterowanie przekazać do przerwań, nie ma aż tylu zakłóceń, niespodzianek z drganiem styków, delayami itp. Program jest przy tym jasny i czytelny dla wszystkich. Jak zakumasz o co biega w przerwaniach nie będziesz już chciała niczego innego :-) Dobra, napisałem gotowca... moim zdaniem powinien działać jak potrzebujesz, ale mogłem o czymś zapomnieć.
Dokładny opis masz w komentarzach. Może się przyda:

Kod: Zaznacz cały

/*
Termostat by wojtekizk ([email protected])
*/
#include <EEPROM.h>                  // taki bajer - program będzie pamietał nasze nastawy :-)
#include <LiquidCrystal.h>           // konieczne dla LCD
LiquidCrystal lcd(8,9,4,5,6,7);      // tu trzeba zmienić jeśli masz inaczej 
byte newChar[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };
// powyżej zdefiniowaliśmy niestandardowy znak małego kółeczka dla st. Celsjusza
volatile int usttemp=40;     // nasza wymagana temperatura, konopie ją uwielbiają :-)  
volatile int temp;           // aktualna temperatura otoczenia
volatile int zmiana=0;       // zmienna pomocnicza, do obslugi klawiszy
long time0, time1;           // interfały czasowe do obsługi LCD

// --- funkcje podniesienia temp. o 1 st. C (max. = 52 st. C)  ---------------------------------
void upT()
{
  if(zmiana==0) {usttemp++;if(usttemp>52)usttemp=52;EEPROM.write(0,usttemp);}
  LCD_linia2();  // aktualizuję temperaturę na wyswietlaczu
  zmiana=1;time0=millis();
}
// --- funkcje obnizenia temp. o 1 st. C (min. = 8 st. C)  --------------------------------------
void downT()    
{
  
  if(zmiana==0){usttemp--;if(usttemp<8)usttemp=8;EEPROM.write(0,usttemp);}
  LCD_linia1();  // aktualizuję temperaturę na wyswietlaczu
  zmiana=1;time0=millis();
}
// --- funkcja, komunikat dla pierwszej linii LCD -----------------------------------------------
void LCD_linia1()
{
  lcd.setCursor(0,0);lcd.print("Akt.Temp.=      ");
  lcd.setCursor(11,0);lcd.print(temp);lcd.write(1);lcd.print("C");
}
// --- funkcja, komunikat dla drugiej linii LCD -------------------------------------------------
void LCD_linia2()
{
  lcd.setCursor(0,1);lcd.print("WYMAGANA =      ");lcd.setCursor(11,1);
  lcd.print(usttemp);lcd.write(1);lcd.print("C");
}
// ----------------------------------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  pinMode(12,OUTPUT);digitalWrite(12,LOW); // tu podpinamy układ wykonawczy z przekaźnikiem najlepiej OPTO
  pinMode(2,INPUT);digitalWrite(2,HIGH);   // pin 2 to przerwanie INT 0 
  attachInterrupt(1,downT,LOW);        // obsługa przerwań i przekazujemy sterowanie do funkcji downT
  pinMode(3,INPUT);digitalWrite(3,HIGH);   // pin 3 to przerwanie INT 1
  attachInterrupt(0,upT,LOW);              // obsługa przerwań i przekazujemy sterowanie do funkcji upT
  lcd.begin(16,2);                         // inicjalizacja wyświetlacza LCD
  lcd.clear();                             // czyścimy ekran, przed świętami przyda się :-)
  lcd.createChar(1,newChar);               // towrzymy własny znak w pamięci LCD
  if(EEPROM.read(0)==255 || EEPROM.read(0)==0)EEPROM.write(0,usttemp); // czytamy pierwszą komórkę EEPROM, 
  usttemp=EEPROM.read(0); // odczytujemy EEPROM
  time0=millis();     // startujemy odliczanie aby przelączać LCD po 10 sek. od chwili ost. przerwania                    
  // jeśli nie jest zapisana to wpisujemy do niej naszą domyślną temperaturę. Po ponownym resecie nasz 
  //termowentylator  już będzie pamiętał to co ustawiliśmy (pamięć nieulotna)
}      
// ----------------------------------------------------------------------
void loop()
{
  zmiana=0;       // zmienna pomocnicza dla kontroli przerwań, po to aby przy długo wciśniętym przycisku
                  // nie generować ponownie przerwań
  time1=millis(); // do przełączanie LCD na rózne komunikaty  
  temp = (analogRead(1)-500)/10; //nasz czujnik to MCP 9700 - popularny czujnik temp.ze "starter kita"
  /* 
  jesli chcesz użyć inny, np. Dallas to zamiast tej JEDNEJ linii programu musisz wstawić tutaj kilka
  linii odpowiedzialnych za odczyt temperatury z czujnika Dallas czyli:
  na poczatku programu:  
      #include <OneWire.h>
      #include <DallasTemperature.h>
      #define ONE_WIRE_BUS A0
      OneWire oneWire(ONE_WIRE_BUS);
      DallasTemperature sensors(&oneWire);
  w setupie:
      sensors.begin();  
  a w loopie:  
      sensors.requestTemperatures();
      temp=sensors.getTempCByIndex(0);   ... i potem odpowiednio przeliczyć na st. C, 
      u mnie to (analogRead(1)-500)/10 już podaje w st. C.
  W sumie całkiem sporo - czyli aż 8 linii programu zamiast jednej 
  (inna sprawa że czujnik Dallas jst o niebo dokładniejszy i ma dowolnie konfigurowalne paramety,
  poza tym na jednej linii można podpiąć ich całkiem sporo).
  Jednak do termostatu wystarczy mała dokładność i mały zakres, jak do akwarium. 
  */
  //usttemp = EEPROM.read(0); // tutaj czytamy naszą wymaganę temperaturę z pamięci EEPROM
  LCD_linia1();             // wyświetlamy pierwszą linię na wyświetlaczu
  LCD_linia2();             // wyświetlamy drugą linię na wyświetlaczu
  delay(800);              // czekamy 5 sekund ... ile chcesz właściwie
  
  if(usttemp>temp && (time1-time0)>10000)          // jeśli aktualna temperaturajest za niska 
      // i minęło co najmniej 10 sekund od ost. przerwania to: 
    {
    lcd.setCursor(0,0);lcd.print("FUNKCJA  GRZANIA"); // komunikat dla pierwszej linii LCD
    lcd.setCursor(0,1);lcd.print("*JEST ZALACZONA*"); // komunikat dla 2 linii LCD
    delay(5000); time0=millis();              // czekamy 5 sekund (dowolnie)
    }
  if(usttemp>temp) digitalWrite(12,HIGH);     // włączamy grzanie (obwód wykonawczy)  
  else digitalWrite(12,LOW);    // jeśli już temperatura OK to wyłączamy grzanie  
  
 }
 // === KONIEC ============================================================================
Pozdrawiam
Ancur
Młodszy majsterkowicz
Posty: 2
Rejestracja: 5 gru 2013, 12:18

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: Ancur » 22 gru 2013, 15:56

Dziękuję bardzo za pomoc na pewno się przyda.

Pozdrawiam.
Awatar użytkownika
hyena
Młodszy majsterkowicz
Posty: 34
Rejestracja: 28 lis 2013, 23:51

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: hyena » 21 lut 2014, 06:00

A gdzie histereza ?? Bo na granicy zadana a odczytana może być niestabilnie, chyba. Bawiłem się czujnikami LM35 i wiem że uprawiają szaleństwo przy odczycie jedno miejsce po przecinku. Nawet jeżeli zokrąglimy odczyt do jednego stopnia to i tak będzie to samo przy przejściu granicznym.(zadana-odczytana) Co będzie się objawiać trzaskaniem przekaźnika, no chyba że element wykonawczy a właściwie włanczający grzanie będzie to element elekroniczny typu tyrystor, triak, tranzystor.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: wojtekizk » 21 lut 2014, 10:41

Witam

Kod: Zaznacz cały

if(usttemp>temp && (time1-time0)>10000)          // jeśli aktualna temperaturajest za niska 
      // i minęło co najmniej 10 sekund od ost. przerwania to: 
    {
    lcd.setCursor(0,0);lcd.print("FUNKCJA  GRZANIA"); // komunikat dla pierwszej linii LCD
    lcd.setCursor(0,1);lcd.print("*JEST ZALACZONA*"); // komunikat dla 2 linii LCD
    delay(5000); time0=millis();              // czekamy 5 sekund (dowolnie)
    }
  if(usttemp>temp) digitalWrite(12,HIGH);     // włączamy grzanie (obwód wykonawczy)  
  else digitalWrite(12,LOW);    // jeśli już temperatura OK to wyłączamy grzanie  
wariant A:
Jeśli ustawiona jest wyższa niż obecna to:
- delay(5000); ---> pseudohistereza
- załączenie grzałki
W przeciwnym wypadku wyłączenie jej.

wariant B:
Jeśli ustawiona jest co najmniej równa lub niższa od obecnej to:
- wyłączenie grzałki.
W przeciwnym wypadku załączenie jej.

Teoretycznie w wariancie B nie jest potrzebna już zwłoka 5 sek. ponieważ po załączeniu i tak. wracamy do wariantu A.
ale... i tu kolega ma rację dla pewności można dać także te 5 sek. zwłoki. Często bowiem przy załączeniu dużego obciążenia wszystko nam przygasa już nie mówiąc o zakłóceniach.
Możemy także dla pewności w samej pętli loop() dać ze 20 razy delay(6000) i po problemie. Nasz przekaźnik będzie sobie co np.2 minuty pykał.
Jeśli natomiast bardzo nam przeszkadza owo delay() to zawsze możemy inaczej skonstruować warunki:
A - if (usttemp>temp) { ...ble, ble ble ... }
B - if (usttemp<temp) { ...ble, ble ble ... }

...czyli w przypadku równości obu zmiennych nie robimy nic ( czyli de facto mamy pełną jednostopniową histerezę) :-)

Pozdrawiam
...aaaa i to nie prawda, że nikt nie lubi hyeny :-)
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: v-cu » 4 mar 2014, 17:01

Witam wiem że temat jest związany z czujnikiem DS18B20 ale po co mam zaśmiecać forum jak program który napisałem to też termoregulator tylko że na lm35 :)
Na początku pochwale się kodem:
#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
int przekaznik = 8;
int dodawanie = 7;
int odejmowanie = 6;
int przycisk1 = 0;
int przycisk2 = 0;
int ustaw = 20;
void setup() {
  lcd.begin(16,2);
  lcd.print("T=");
  lcd.setCursor(0,1);
  lcd.print("N=");
}
void loop() {
  int sensorValue = analogRead(A0);
  float temp = sensorValue * (5.0 * 100.0/1023.0);
  lcd.setCursor(2,0);
  lcd.print(temp);
  delay(100);
  lcd.setCursor(2,1);
  lcd.print(ustaw);
    
    
  przycisk1 = digitalRead(dodawanie);
if(przycisk1 == HIGH){
  delay(30);
  ustaw=ustaw+1;
  lcd.setCursor(2,1);
  lcd.print(ustaw);
delay(100);}


  przycisk2 = digitalRead(odejmowanie);
if(przycisk2 == HIGH){
  delay(30);
  ustaw=ustaw-1;
 lcd.setCursor(2,1);
lcd.print(ustaw);
delay(100);}

  if(temp < ustaw){
    digitalWrite(przekaznik,HIGH);}
    if(temp > ustaw+1){
     digitalWrite(przekaznik,LOW);}
  }
Teraz mam kilka pytań. Jak do tego programu dodać właśnie histerezę ( delay w tej fukcji: if(temp < ustaw){
digitalWrite(przekaznik,HIGH);} odpada bo kompilkuje cały program)
Co tu można jeszcze dodać ciekawego? :)

PS
Cały układzik będzie wyglądał tak. Plus do tego obok dwa przyciski do dodawania i odejmowania zadanej temperatury, załącznik, i myślę nad podświetlaniem. Kikam przycisk i na jakieś 5 sekund załącza mi się podświetlanie w lcd. Ogólnie cały programik będzie potem wgrany na ATmegę8.
IMG_20140302_181543.jpg
Pozdrawiam
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: wojtekizk » 13 mar 2014, 11:19

Witam
Jakaś monotonia na tej fotce... co tu dodać ciekawego... może logo :-)
Pozdrawiam
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: TERMOREGULATOR= lcd + DS18B20

Post autor: v-cu » 13 mar 2014, 11:47

Założyłem osobny temat do tego termoregulatora :). Ogólnie obudowa wygląda już tak:
http://img.tapatalk.com/d/14/03/13/quvemyra.jpg
Zostało mi tylko włożyć elektronikę do środka :)
Ostatnio zmieniony 13 mar 2014, 21:44 przez v-cu, łącznie zmieniany 1 raz.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: TERMOREGULATOR= lcd + DS18B20

Post autor: wojtekizk » 13 mar 2014, 13:24

To lcd to jest 8x2?
Ciekawi mnie czym robisz takie duże otwory na buttony... ja kurcze cały czas powiększam je nożyczkami :-)
Te niebieskie są odlotowe, szczena opada :-)
Pozdrawiam
aaaa... i bym zapomniał - fajny pomysł z tymi znacznikami img, że można tak dołączyć linka z kropkami :-)
Że też ja na to nie wpadłem :-) Gratki :-)
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: TERMOREGULATOR= lcd + DS18B20

Post autor: v-cu » 13 mar 2014, 15:19

Tak jest to 8x2. Otwory na przyciski robię normalnie wiertarką najpierw małym wiertłem 2mm potem 5mm potem 8mm i na końcu 10mm. :)
ODPOWIEDZ

Strony partnerskie: