Schema de conectare a senzprilor este identica, toti 5 vor fi in paralel:
iar prezentarea datelor am facut-o pe un afisaj LCD alfanumeric cu 16 coloane si 2 randuri (1602 sau 16x2):
Montajul arata asa:
Am adaptat sketch-ul folosit in articolul Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel combinandu-l cu cel din articolul Interfata i2c la LCD pentru Arduino:
// full sketch by niq_ro from http://nicuflorica.blogspot.com
// or http://www.tehnic.go.ro
// or http://arduinotehniq.blogspot.com/
#include <Wire.h> // for i2c protocol
#include <OneWire.h>
// http://www.pjrc.com/teensy/td_libs_OneWire.html
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // 0x20 is adresss for LCC 16x2
byte grad[8] = {
B01110,
B10001,
B10001,
B01110,
B00000,
B00000,
B00000,
};
int ics =0; //count number of sensor
void setup(){
lcd.init();
lcd.backlight(); //backlight is now ON
// set up the LCD's number of columns and rows:
lcd.createChar(0, grad);
lcd.begin(16, 2);
// Print a logo message to the LCD.
lcd.print("www.tehnic.go.ro");
lcd.setCursor(0, 1);
lcd.print("creat de niq_ro");
delay (2500);
lcd.clear();
// Print a message to the LCD.
lcd.setCursor(1, 0);
lcd.print("temperatura in");
lcd.setCursor(1, 1);
lcd.print("mai multe zone");
delay (2500);
lcd.clear();
}
void loop(){
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
if ( !ds.search(addr)) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("doar ");
lcd.print(ics);
lcd.print(" senzor(i)");
ds.reset_search();
ics=0;
return;
}
ics++;
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("ROM=");
for( i = 0; i < 8; i++) {
lcd.print(' ');
lcd.print(addr[i], HEX);
}
if (OneWire::crc8(addr, 7) != addr[7]) {
lcd.print("CRC is not valid!");
return;
}
celsius = (float)raw / 16.0;
lcd.setCursor(0,0);
lcd.print("Temp");
lcd.print(ics);
lcd.print(" = ");
lcd.print(celsius);
lcd.write(byte(0));
lcd.print("C ");
delay(3000);
}
Am facut si 2 filmulete:- masurare temperatura in mai multe puncte cu DS18B20 si MAX31820 folosind Arduino si LCD1602 cu i2c
Am desenat schema completa de conectare a senzorilor din familia DS18x20 (DS18B20, DS18S20, DS1822, MAX31820) si a afisajului LCD 1602 cu interfata i2c:
Banuiesc ca senzorii erau toti in apropiere.Daca ar fi sa ii mutam in mai multe camere care ar fi lungimea maxima a cablului .. poate faceti un test
RăspundețiȘtergerebai frate.... in poze se vede ca-s la 1cm unul de altul... merge si lungime mare, doar transmisia datelor e digitala... citeste si tu datasheet-ul: http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
RăspundețiȘtergereBuna ziua, am cerut si eu niste mostre gratuite de DS18B20 de la ei si de cateva zile tot schimbam mailuri.. ba vor adresa siteului, ba sa semnez niste hartii in ce scop le folosesc .. si apoi ca ma costa 9 lire shipingul. Ati patit la fel ? Multumesc
RăspundețiȘtergereeu am luat doar 2 bucati, exact cat era acolo la "free samples".... nu ma cerut mai multe....
RăspundețiȘtergereSi eu tot atat si am mai cerut 2 de Ds1307.. deci sa inteleg ca nu v-au cerut date suplimentare
Ștergerela inceput au cerut tot felul de date, adresa de mail trebuie sa fie una platita (nu gratuita, gem yahoo, gmail), le-am dat site-ul...
RăspundețiȘtergereBuna ziua ,imi puteti spune va rog frumos de ce cand copiez sketch-ul si dau verificare" ..imi da numai erori" adica numai fond galben ....este posibil sa nu am toate librariile bine instal ?... mentionez ca sunt incepator in domeniu o parere mi-ar fi de mare ajutor . Va multumesc anticipat.
RăspundețiȘtergeredepinde ce mesaj de eroare iti da... banuiesc ca ai libraria OneWire ca e scris si link-ul in sketch... posibil sa ai probleme cu libraria LiquidCrystal_I2C... vezi la mine unde am folosit-o si, poate, am scris, de unde am descarcat-o.... daca nu te descurci copiaza mesajul de eroare... ca nu pot anticipa toate cazurile....
RăspundețiȘtergerela https://www.dropbox.com/sh/ribcy2uxjz9t8dt/AAAv8W57rJW6rwZitUbXMk6ua?dl=0 gasesti mai multe librarii, printre care si LiquidCruystal_I2C care merge cu acest sketch...
RăspundețiȘtergereBuna Nicu. Intentionez sa folosesc ca baza sketch-ul tau pentru controlul unei centrale termice cu combustibil solid.
RăspundețiȘtergereVreau sa afisez simultan 6 sau mai multe temperaturi cu rezolutie 0.1grad. Pentru asta cred ca un ecran 20x4 e mai potrivit.
In functie de starea temperaturilor, vreau sa comand 3-4 relee care sa actioneze pompe sau altceva. Cred ca un modul cu 4 relee pe i2c e mai potrivit si lasa loc de adaugare ulterioara si pentru alte module.
Iar daca vreau sa pot seta conditile fara sa modific programul, ar trebui si un bloc cu cel putin 3 butoane si o rutina speciala.
Ideea e sa fie un sistem cat mai ieftin. Poate un kit Reduino sau chiar mai mic ar fi mai potrivit in loc de Arduino Uno.
As dori parerea ta cu privire concept.
interesant, dar ieftin (Reduino) cu placa i2c de relee se cam bat cap in cap... daca imi spui ce vrei sa reglezi o sa pot spune daca te pot ajuta... discutam pe mail ( nicu.florica@gmail.com)
RăspundețiȘtergere