Nastavení hystereze u teploty

« Zpět na předchozí stránku
0
0
Marked as spam
Odeslal drawtt (Otázky: 2, Odpovědi: 4)
Odpověděl na 20.12.2016 19:30
628 zobrazení

ako naprogramovat hyterezu na snimaci teploty v danom programe a pripojit dve cila . modul na viac cidiel dallas mam . tu je moj kod : //program pre kotol UK , LCD 16×2 . jednokanálové relé, snímač teploty Dallas temperature waterproof DS18B20
//lcd je zapojené na I2C zbernici, výstupy zbernice komunikacny port SCL a SDA,GND , 5V
//snímač teploty je cez modul zapojený na gnd, 5v, a pin 2
//jednokanálové relé je zapnuté na gnd, 5v a pin 8
//20.12.2016

#include
#include “LCD.h“ // For LCD
#include “LiquidCrystal_I2C.h“ // Added library*

//Set the pins on the I2C chip used for LCD connections
//ADDR,EN,R/W,RS,D4,D5,D6,D7
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); // 0x27 0x3F is the default I2C bus address of the backpack-see article
int DS18S20_Pin = 2; //DS18S20 Signalny pin na digital 2, takto napojime dalsie cidlo bez modulu na pin 3 (2,3);

int relay =8;

//Temperature chip i/o
OneWire ds(DS18S20_Pin); // zapojene na digitalny pin 2

void setup(void) {

// Set off LCD module
lcd.begin (16,2); // 16 x 2 LCD module
lcd.setBacklightPin(3,POSITIVE); // BL, BL_POL
lcd.setBacklight(HIGH);

Serial.begin(9600);
pinMode(8, OUTPUT); //slovensky: nastav rele pin 8 ako výstup
}

void loop(void) {
float temperature = getTemp();

//float tempF = (temperature * 9.0)/ 5.0 + 32.0;
Serial.println(temperature); // názov volania cidla
lcd.setCursor (0,0); // horný riadok displeja, teplota čerpadlo viz riadok niž
lcd.print(“Teplota Cerpadlo“);

if (temperature >25) { //podmienka pre zapínanie čerpadla ak je teplota vyššia, ako 22 st C zapni
digitalWrite(8,HIGH); //pust napatie na pin 8
lcd.setCursor (7,1); //vypíš na druhom riadok od pozície 7 ON viz riadok niž druhy riadok zacina 15.1
lcd.print(“ ON“);
} else {
digitalWrite(8,LOW); // ked skonci horna podmienka teplota vyššia ako 22 st C teda je nižšia ako 22 st C vypne sa repadlo
lcd.setCursor (7,1);
lcd.print(“ OFF“); // tu potrebujem prida histerziu zap 22 vyp 20 !!!!!!!

}

delay(100); //spomal opakovanie aby bol citatelny vysledok volanej hodnoty teploty 1000= 1s

}

float getTemp(){
//vracia teplotu z čidla v stupnoch celzia

byte data[12];
byte addr[8];

if ( !ds.search(addr)) {
//žiadne ďalšie senzory na reťazce, resetovanie vyhľadávanie
ds.reset_search();
return -1000;
}

if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!“);
return -1000;
}

if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print(“Device is not recognized“);
return -1000;
}

ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad

for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB

(drawtt at 20.12.2016 19:33)
1
Soukromá otázka
Trošku nepřehledný kód. Jsou tam nějaké zbytečné věci, ale pokud to funguje tak nic proti. Řešení je jednoduché. Zde jen teoretický kód:
const int cerpadlo = 8;
boolean cerpadloZapnuto = false;

void setup() {
  pinMode(cerpadlo, OUTPUT);

}

void loop() {
  
  if ((teplota > 22) && (!cerpadloZapnuto))
  {
    digitalWrite(cerpadlo, HIGH);
    cerpadloZapnuto = true;
  }
  else if ((teplota < 20) && (cerpadloZapnuto))
  {
    digitalWrite(cerpadlo, LOW);
    cerpadloZapnuto = false;
  }


}
Stačí do podmínky "if" přidat logický operátor AND (&&) a vyhodnocovat jestli běží čerpadlo (boolean cerpadloZapnuto). Takový demoprogram jsem napsal zde. Místo teploty to generuje číslo od 17 do 23 a vypisuje to stavy do SerialMonitoru. Jinak čerpadlo simuluje vestavěná LED na Arduino UNO (13):
const int cerpadlo = 13;
boolean cerpadloZapnuto = false;

void setup() {
  pinMode(cerpadlo, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
int  teplota = 17;
while(teplota < 27){
    Hystereze(teplota);
    Serial.print("Teplota: ");
    Serial.println(teplota);
    teplota++;
    delay(800);
    } 
while(teplota > 17){
    Hystereze(teplota);
    Serial.print("Teplota: ");
    Serial.println(teplota);
    teplota--;
    delay(800);
    } 
}


void Hystereze(int teplota)
{
 if ((teplota > 22) && (!cerpadloZapnuto))
  {
    digitalWrite(cerpadlo, HIGH);
    cerpadloZapnuto = true;
    Serial.println("Zapinani cerpadla");
  }
  else if ((teplota < 20) && (cerpadloZapnuto))
  {
    digitalWrite(cerpadlo, LOW);
    cerpadloZapnuto = false;
    Serial.println("Vypinani cerpadla");
  }
}
Marked as spam
Odeslal Administrátor (Otázky: 2, Odpovědi: 7)
Odpověděl 22.12.2016 0:41

OK dakujem uz som to rozchodil

(drawtt at 24.12.2016 12:48)
« Zpět na předchozí stránku
Translate »