duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Ovládání čerpadla podlahovky  (Přečteno 5457 krát)

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Ovládání čerpadla podlahovky
« kdy: Březen 07, 2016, 10:59:43 dopoledne »
Ahoj lidi :)
Jsem nováčkem a chtěl bych vás poprosit o radu.
Mám v hlavě projekt ovládání čerpadla podlahového topení.
Sestava je :
1)ATmega328P Arduino Compatible Nano V3 (nebo nějaké jiní, zatím používám desku mega)
2)teplotní čidlo ds18b20
3) LCD I2C
4)relé 5V-modul
Celé to má fungovat v podstatě jako termostat. Prolezl jsem net, něco přečetl ale doposud se mi nepodařilo sestavit funkční kód. Mohl by mi někdo z Vás zkušených pomoci?? Předem děkuji :)

Kód: [Vybrat]
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#define pinMode 3;
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);             


int DS18S20_Pin = 2;                                   

                                                     
OneWire ds(DS18S20_Pin);                             

void setup(void) {
  Serial.begin(9600);
  lcd.begin(20,4);                               
                                                     
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("podlaha");
  lcd.setCursor(0, 1);
  lcd.print("Second Line");

pinMode(3,OUTPUT);

}

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
  lcd.setCursor(0, 1);
  lcd.print(temperature);

 
  delay(100);
 
}

float getTemp(){
 

  byte data[12];
  byte addr[8];
}
  if ( !ds.search(addr)) {
     
      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);

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

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

  float tempRead = ((MSB << 8 ) | LSB);
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 

if (temperature >35) {
digitalWrite(3,HIGH);
}
else {
digitalWrite(3,LOW);
}
« Poslední změna: Říjen 02, 2016, 20:34:50 odpoledne od Yenda »

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #1 kdy: Březen 07, 2016, 19:42:16 odpoledne »
ok , v čem je problém?
Hlavně si to musíš představit, jak to má fungovat a trochu to popsat.
Co má být vidět na LCD, jak se to má ovládat, jaké jsou mezní paramtery, atd.
Bez toho ti asi moc nepomůžeme.

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #2 kdy: Březen 07, 2016, 20:52:11 odpoledne »
Jak říkám má to fungovat jak termostat. Na displeji  se ukazuje pouze aktuální teplota podlahovky nic víc. Při teplotě 35°C sepne relé které pustí šťávu do čerpadla. Po poklesu pod 35°C, relé odpjí čerpadlo. Napsal jsem tam i program, nebo spíše sem ho zkusil poskládat se 2. Někde je chyba a nemůžu na ní přijít. Takže potřebuji pomoct s programem ;)  ;D ;D
« Poslední změna: Březen 07, 2016, 20:55:26 odpoledne od Fon Bobek »

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #3 kdy: Březen 07, 2016, 21:46:52 odpoledne »
jen od pohledu nemáš uzavřenou funkci
Kód: [Vybrat]
float getTemp()
nebo
if (temperature >35) {
      digitalWrite(3,HIGH);
   } else {
      digitalWrite(3,LOW);

Na konci ti schází složená závorka.
Co ti to píše?
« Poslední změna: Říjen 02, 2016, 20:35:13 odpoledne od Yenda »

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #4 kdy: Březen 08, 2016, 09:17:44 dopoledne »
Závorky doplněny, jen doufám že správně :) Přesto to vyhajźuje chybové hlášení


pokus_7.3_nefunkcni.ino: In function 'void loop()':
pokus_7.3_nefunkcni.ino:38: error: a function-definition is not allowed here before '{' token
pokus_7.3_nefunkcni.ino:45: error: 'addr' was not declared in this scope
pokus_7.3_nefunkcni.ino:48: error: return-statement with a value, in function returning 'void'
pokus_7.3_nefunkcni.ino:51: error: 'addr' was not declared in this scope
pokus_7.3_nefunkcni.ino:53: error: return-statement with a value, in function returning 'void'
pokus_7.3_nefunkcni.ino:56: error: 'addr' was not declared in this scope
pokus_7.3_nefunkcni.ino:58: error: return-statement with a value, in function returning 'void'
pokus_7.3_nefunkcni.ino:62: error: 'addr' was not declared in this scope
pokus_7.3_nefunkcni.ino:71: error: 'data' was not declared in this scope
pokus_7.3_nefunkcni.ino:76: error: 'data' was not declared in this scope
pokus_7.3_nefunkcni.ino:82: error: return-statement with a value, in function returning 'void'
pokus_7.3_nefunkcni.ino:90: error: expected `}' at end of input

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #5 kdy: Březen 08, 2016, 09:33:27 dopoledne »
tak sem hod ten upraveny kod ... jeste koukam ze ti prebyva } za byte adr[8];
je treba si zvyknout na stabni kulturu. neni to nejaky poucovani o blbostech jen pak neztratis prehled treba prave o uzavreni cyklu a pod.

kdyz neco takoveho delas tak si napis jednoduchy kod co ti funguje a uloz. pak si jej uloz jako verze 2  a udelej dalsi funkci. odzkousej uloz jako verzi 3 atd atd. delej si poznamky co jsi v te verzi zmenil. delej si srozumitelbe komentare popis jednotlive funkce co potrebuji jako vstup co s tim udelaji a jaky je vysledek.

chapu ze to zni hrozne a dlouho jsem se tomu branil ale kdyz po mesici otevres svuj kod a nevis co jak funguje je neco spatne. a kdyz to nwvis ty tak ostatni to stoji 2x tolik casu na to prijit.

byt tebou orezu ten kod na minimum odzkousim odladim a pridam kus .... to uz se opakuju

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #6 kdy: Březen 08, 2016, 10:20:16 dopoledne »
Toto je funkční program měření teploty.

Kód: [Vybrat]
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7);  // set the LCD address to 0x27 for a 16 chars and 2 line display


int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

void setup(void) {
  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("podlaha");
//  lcd.setCursor(0, 1);
//  lcd.print("Second Line");



}

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
  lcd.setCursor(0, 1);
  lcd.print(temperature);

 
  delay(100); //just here to slow down the output so it is easier to read
 
}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

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

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      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 << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
Odzkoušel sem si ho a následně sem do něho chtěl dopsat to ovládaní relé, dle teploty. Akorát, že mi to neustále nejde.Popisky si dělám, jak jsi říkal. Je to super věc, o tom žádná.

Kód: [Vybrat]
#define pinMode 3;

if (temperature >35)
      digitalWrite(3,HIGH);  //relé sepnuté
}
else {
      digitalWrite(3,LOW); //relé vypnuté
}
« Poslední změna: Říjen 02, 2016, 20:36:24 odpoledne od Yenda »

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #7 kdy: Březen 08, 2016, 10:29:25 dopoledne »
uz tam vidim dalsi 2 chyby. az budu u pc tak ti to opravim a poslu.

podminka mereni je mimo funkci. vlastne provedes mereni teploty a nechas si poslat zpatky teplotu. potom v te same funkci chces resit podminky sepnuti rele. arduino si asi poradilo tak ze v return ukoncilo funkci protoze jinak by se zacyklyl sam do sebe.
druha vec je ze pri #define se na konci radku tusim nedela strednik ... i kdyz chybu to nehazi podle toho co pises.

vyzkousim upravy poslu ...

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #8 kdy: Březen 08, 2016, 10:33:09 dopoledne »
jeste by to pak chtelo moznost prenastaveni teploty napr. trimrem na analogovem vstupu v rozsahu treba 30-40*C nastavit si hysterezy at ti cerpadlo neustale nezapina/nevypina. a posledni vec : dat tam piezomenuc jako signalizaci prekroceni teploty. vse ale postupne v klidu ...

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #9 kdy: Březen 08, 2016, 11:13:53 dopoledne »
Jsem totální začáteční a laik ::). Ten program jsem našel na netu a upravil sem tam akorát to LCD.
Chtěl sem to dělat tak jak si říkal. Postupně přidávat další a další věci. Takže po vyřešení problému s relé,měla přijít na řadu zvuková signalizace poruchy popřípadě nebezpečné teploty,detekce plynu ale k tomu sem se nedostal. Nevím jak si zběhlý v podlahovým topení, ale já potřebuji mít dané striktně ze od 35°C se spustí čerpadlo a naopak(trimr je komfortní, ale nechci aby na to makaly děti). Každopádně Ti chci poděkovat za tvou ochotu, pomoc,  a čas, který mi věnuješ. :)

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 116
Re:Ovládání čerpadla podlahovky
« Odpověď #10 kdy: Březen 08, 2016, 18:50:27 odpoledne »
Trochu mimo téma:

Problémům se závorkami se dá dobře předejít, když si je budeš v kódu psát přesně pod sebe.
A ty části, které jsou uvnitř závorek ještě o nějakou mezeru odsadíš.
Program se zpřehlední a na první pohled vidíš, které závorky k sobě patří.

Jedinou nevýhodu tohoto způsobu zápisu vidím v tom, že se o několik řádek prodlouží zdroják - což může být problém třeba při tisku na tiskárně.

Příklad kusu kódu se zvýrazněnými závorkami:

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:Ovládání čerpadla podlahovky
« Odpověď #11 kdy: Březen 08, 2016, 19:49:51 odpoledne »
tak mě to nejde. Vypadá to, že máme rozdílené knihovny:
D:\arduino-1.0.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h: In function 'void setup()':
D:\arduino-1.0.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:154: error: 'int LiquidCrystal_I2C::init()' is private
sketch_mar08a:15: error: within this context
sketch_mar08a.ino: In function 'float getTemp()':
sketch_mar08a:72: error: incompatible types in assignment of 'uint8_t' to 'byte [12]'
sketch_mar08a.ino:66: warning: unused variable 'present'

Co máš za Arduino IDE a za knihovny?

to astromik : přesně takhle to dělám i já. jinak se v kodu ztrácím. Navykl jsem si na TAB klávesu a teď mám problémy, když přecházím někam, kde nemají můj oblíbený PSPAD (ten v TAB udělá  2 mezery) a  jsem nucen použít poznámkový blok (TBA dělá odskok asi 5-6 mezer) ,,,

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #12 kdy: Březen 08, 2016, 20:55:53 odpoledne »
Já používám Arduino IDE 1.0.6, a knihovna ma označení myslím LiquidCrystal 1.2.1. Nevím to přesně pač jsem si nechtíc IDE smáznul  :'( z nového compa ne nemůžu ho ani boh nainstalovat zpět. Takže teť používám starou vykopávku na, které to jakž takž jede. Ještě jednou sem se koukal na ten program co jsem tady vložil. Nevím jak se to stalo asi chyby v kopírování. Takže ještě jeden pokus.(dá se tady vkládat nějaké soubory, myslím jako teksťáky a pod.)

Kód: [Vybrat]
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // set the LCD address to 0x27 for a 16 chars and 2 line display


int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

void setup(void) {
  Serial.begin(9600);
  lcd.begin(20,4);                      // initialize the lcd
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("PODLAHA");
//  lcd.setCursor(0, 1);
//  lcd.print("Second Line");



}

void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
  lcd.setCursor(0, 1);
  lcd.print(temperature);

 
  delay(100); //just here to slow down the output so it is easier to read
 
}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

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

  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      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 << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
Takže tento by měl byt funkční, za nedopatření se omlouvám :)
« Poslední změna: Říjen 02, 2016, 20:39:43 odpoledne od Yenda »

Offline K.K

  • Bastlíř amatér
  • **
  • Příspěvků: 86
Re:Ovládání čerpadla podlahovky
« Odpověď #13 kdy: Březen 09, 2016, 10:05:53 dopoledne »
Ja klucí dělal jedno heblo s displejem před měsicem a žadny problem.
Po změně  lcd.begin ( 16 , 2 ); na 4 v pohodě i 4 řadkový.
http://www.arduinoecia.com.br/2014/12/modulo-i2c-display-16x2-arduino.html
Je tam i odkaz na tu knihovnu LiquidCrystal 1.2.1 a rozchodil jsem to na první pokus.
Jen použivám arduino-1.6.7

Trochu nechapu, co Fon Bobek nemuže nainstalovat?
Nikdy jsem nic neinstaloval.
Stah jsem zip verzí, rozbalil a jedu.
Mam IDE uplně na jinem disku než system a i cestu ke knihovnam přesměrovanou na jiny disk.

Mam IDE i na flashdisku na kličích a v pohodě.
Také milují PsPad a nosím ho na flashdisku.

Offline Fon Bobek

  • Bastlíř začátečník
  • *
  • Příspěvků: 10
Re:Ovládání čerpadla podlahovky
« Odpověď #14 kdy: Březen 09, 2016, 10:43:19 dopoledne »
Ja klucí dělal jedno heblo s displejem před měsicem a žadny problem.
Po změně  lcd.begin ( 16 , 2 ); na 4 v pohodě i 4 řadkový.
http://www.arduinoecia.com.br/2014/12/modulo-i2c-display-16x2-arduino.html
Je tam i odkaz na tu knihovnu LiquidCrystal 1.2.1 a rozchodil jsem to na první pokus.
Jen použivám arduino-1.6.7

Trochu nechapu, co Fon Bobek nemuže nainstalovat?
Nikdy jsem nic neinstaloval.
Stah jsem zip verzí, rozbalil a jedu.
Mam IDE uplně na jinem disku než system a i cestu ke knihovnam přesměrovanou na jiny disk.

Mam IDE i na flashdisku na kličích a v pohodě.
Také milují PsPad a nosím ho na flashdisku.

Buď si IDE instaluješ nebo ho jse spustit i bez instalace. Bohužel, nevím proč, ale na staré vykopávce notebooku mi to jede a na novém ne. Vyzkoušel vše možne a nic. Je mi to záhadou. Zkoušel sem to spouštět i s flash disku anic :'(