luni, 10 februarie 2014

Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel (2)

   In articolul anterior, Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel, am conectat 3 senzori din familia DS18x20 (unul DS18B20 si 2 de tipul MAX31820), acum ca am primit inca 2 monstre de tipul DS18B20 de la Dallas Semiconductor (Maxim Integrated), cum primisem, in ianuarie, si pe cei 2 senzori MAX31820, am zis ca pot citi temperatura in 5 puncte.
 
   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
multipoint thermometer with DS18B20 and MAX31820, Arduino and LCD1602 with i2c interface
11.02.2014
   Am desenat schema completa de conectare a senzorilor din familia DS18x20 (DS18B20, DS18S20, DS1822, MAX31820) si a afisajului LCD 1602 cu interfata i2c:

11 comentarii:

  1. 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Ștergere
  2. bai 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Ștergere
  3. Buna 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Ștergere
  4. eu am luat doar 2 bucati, exact cat era acolo la "free samples".... nu ma cerut mai multe....

    RăspundețiȘtergere
    Răspunsuri
    1. Si eu tot atat si am mai cerut 2 de Ds1307.. deci sa inteleg ca nu v-au cerut date suplimentare

      Ștergere
  5. la 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Ștergere
  6. Buna 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Ștergere
  7. depinde 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Ștergere
  8. la 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Ștergere
  9. Buna Nicu. Intentionez sa folosesc ca baza sketch-ul tau pentru controlul unei centrale termice cu combustibil solid.
    Vreau 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.

    RăspundețiȘtergere
  10. 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