ArduShop.ro

ArduShop.ro
cod Z4A413ZN reducere 5%, pentru vizitatorii paginilor mele !

joi, 29 ianuarie 2015

ATtiny85 si senzori de temperatura DS18B20

   Dupa cum am scris in articolul precedent ( ATtiny85 si senzorul de umiditate si temperatura DHT11 ) pentru a putea folosi instructiuni care au legatura cu timpii, trebuie ca microcontrolerul ATtiny85 sa fie setat corespunzator si asta se face prin intercalarea unui pas ("scriere bootloader" prin setare placa de dezvoltare ca "ATtiny85 la 8MHz" si programator "Arduino ca ISP"). Acest pas trebuie facut o singura data, deoarece nu scrie cu adevarat un bootloader de Arduino, doar schimba un "fuse".
   Schema folosita pentru teste este:
iar real, e ceva de genul:
   Zona colorata cu galben e partea de stabilizare de 5v realizata cu LM7805, pentru a putea alimenta montajul de la un alimentator sau masina... daca se fac teste cu alimentator de 5V, acea parte poate lipsi.
   Pe ecran, cu 2 senzori DS18B20, am urmatoarele informatii:
   In filmuletul ATTiny85 si DS18B20 se vede si faptul ca ATtiny85 sesiszeaza si cati senzori de temperatura de tip DS18B20 sunt conectati la el. Senzorii DS18B20 se pun in paralel, cum am prezentat in articolul Mai multi senzori de tip DS18B20 (sau MAX31820) in paralel (2).
   Sketch-ul folosit de mine este:
/*
this sketch is adapted by niq_ro from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://nicuflorica.blogspot.ro/
http://arduinotehniq.blogspot.com/
this sketch is made for use DS18B20 sensor(s) with ATtiny85 at 8MHz

 * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
 *     by Rowan Simms   code@rowansimms.com
 *     License: Creative Commons - Attribution.
 *     Full Documentation and Description:  http://rowansimms.com/article.php/lcd-hookup-in-seconds
 *
 * This sketch allows Arduinos to use a shift register to control an LCD, allowing 
 * a reduction in pins it requires from 6 to 3 while still retaining full control
 * including backlight on/off.
 * This requires the use of the LiquidCrystal595 library
 * available at: http://code.google.com/p/arduino-lcd-3pin/
 */

#include <LiquidCrystal595.h>    // include the library
LiquidCrystal595 lcd(0,1,2);     // datapin, latchpin, clockpin

#include <OneWire.h>
// http://www.pjrc.com/teensy/td_libs_OneWire.html
// http://milesburton.com/Dallas_Temperature_Control_Library
OneWire  ds(3);  // on phiscal pin 2  (a 4.7K resistor is necessary)  

byte grad[8] = {
  B01110,
  B10001,
  B10001,
  B01110,
  B00000,
  B00000,
  B00000,
};

int ics =0; //count number of sensor

void setup() {
    lcd.begin(16,2);             // 16 characters, 2 rows
 lcd.createChar(0, grad);

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Wow. 3 pins!");
    lcd.setCursor(0,1);
    lcd.print("Fabulous");
delay(2000);
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();
    delay(250);
   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);
}
   

ATtiny85 si senzorul de umiditate si temperatura DHT11

   Dupa ce in urma cu cateva zile testasem cu rezultate negative niste librarii pentru senzorul DHT11 conectat la ATtiny85, am realizat ca microcontrolerul meu fusese pus pe frecventa interna de 1MHz si atunci nu functioneaza corect functiile legate de timp, asa ca am pus microcontrolerul ATtiny85 la 8MHz si am testat iar.. si acum pot avea informatii de la senzorul DHT11.
 
   In afara pasilor mentionati in articolul Programarea unui microcontroler ATTiny85 cu sketch Arduino trebuie inca un pas, inaintea incarcarii sketch-ului, anume "incarcare bootloader", care doar schimba un "fuse", nu incarca si bootloader.
   In filmuletul DHT11 si ATtiny85 la 8MHz am prezentat si partea de setare la 8MHz.
   Schema de principala de conexiuni este cea folosita si pana acum, doar ca am conectat modulul cu senzor DHT11:
iar real "jungla" arata asa:
 
   Zona colorata cu galben e partea de stabilizare de 5v realizata cu LM7805, pentru a putea alimenta montajul de la un alimentator sau masina... daca se fac teste cu alimentator de 5V, acea parte poate lipsi.
   Sketch-ul folosit de mine este:
/*
this sketch is adapted by niq_ro from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://nicuflorica.blogspot.ro/
http://arduinotehniq.blogspot.com/
this sketch is made for use a DHT11 sensor with ATtiny85 at 8MHz

 * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
 *     by Rowan Simms   code@rowansimms.com
 *     License: Creative Commons - Attribution.
 *     Full Documentation and Description:  http://rowansimms.com/article.php/lcd-hookup-in-seconds
 *
 * This sketch allows Arduinos to use a shift register to control an LCD, allowing 
 * a reduction in pins it requires from 6 to 3 while still retaining full control
 * including backlight on/off.
 * This requires the use of the LiquidCrystal595 library
 * available at: http://code.google.com/p/arduino-lcd-3pin/
 */

#include <LiquidCrystal595.h>    // include the library
LiquidCrystal595 lcd(0,1,2);     // datapin, latchpin, clockpin


#include <dht.h>  // http://arduino.cc/playground/Main/DHTLib
#define DHT11_PIN PB3
dht DHT;

byte grad[8] = {
  B01110,
  B10001,
  B10001,
  B01110,
  B00000,
  B00000,
  B00000,
};

vid setup() {
    lcd.begin(16,2);             // 16 characters, 2 rows
 lcd.createChar(0, grad);

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Wow. 3 pins!");
    lcd.setCursor(0,1);
    lcd.print("Fabulous");
delay(2000);
lcd.clear();
}


void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int chk = DHT.read11(DHT11_PIN);
  int t=0;
  int h=0;
  //_delay_ms(200);
  h=DHT.humidity;
  t=DHT.temperature;
  
 lcd.setCursor(3,0);
    lcd.print("t = ");
//    lcd.print("+");
    lcd.print(t);
    lcd.write(byte(0));
    lcd.print("C   ");
delay(2000);  

 lcd.setCursor(3,1);
    lcd.print("h = ");
    lcd.print(h);
    lcd.print("%RH  ");

  delay(2000);  
}
   

marți, 27 ianuarie 2015

Termometru dublu si indicator tensiune baterie cu ATtiny85 pe afisaj LCD1602

   Daca am putut face cu microcontroleul ATtiny85 un termometru dublu cu afisare pe ecran alfanumeric LCD1602 prin intermediul unui registru de deplasare 74HC595, m-am gandit ca pot sa am si indicarea tensiunii bateriei unei masini si astfel sa am indicatii despre temperatura din exterior si cea din interior, asta daca pot folosi pinul fizic 1, RESET, dar si ADC0 (A0), dupa cum e prezentat pe site-ul http://www.pighixxx.com/
   In cel mai rau caz, voi renunta la temperatura din interior...
   Schema gandita de mine deriva din cea a termometrului dublu la care am adaugat un divizor rezistiv cu raport de 1:4 (tensiune maxima de intrare de 20V), cum am facut la indicarul starii bateriei masinii cu led multicolor.
   Trebuie sa schimb pictogramele, iar afisarea sa fie ceva de genul:
    Pictogramele vor fi de genul:
- baterie: 
- temperatura interior (masina):
- temperatura exterior (un copac):
   Sketch-ul pe care l-am gandit si de care am fost multumit:
/*
this sketch is adapted by niq_ro from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://nicuflorica.blogspot.ro/
http://arduinotehniq.blogspot.com/
for made a dual thermometer & battery status for car with ATtiny85 as Arduino..

 * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
 *     by Rowan Simms   code@rowansimms.com
 *     License: Creative Commons - Attribution.
 *     Full Documentation and Description:  http://rowansimms.com/article.php/lcd-hookup-in-seconds
 *
 * This sketch allows Arduinos to use a shift register to control an LCD, allowing 
 * a reduction in pins it requires from 6 to 3 while still retaining full control
 * including backlight on/off.
 * This requires the use of the LiquidCrystal595 library
 * available at: http://code.google.com/p/arduino-lcd-3pin/
 */

#include <LiquidCrystal595.h>    // include the library
LiquidCrystal595 lcd(0,1,2);     // datapin, latchpin, clockpin

byte baterie1[8] = {
  B00000,
  B01100,
  B11111,
  B10000,
  B10000,
  B10000,
  B10000,
  B11111,
};

byte baterie2[8] = {
  B00000,
  B00110,
  B11111,
  B00001,
  B00001,
  B00001,
  B00001,
  B11111,
};

byte masina1[8] = {
  B00111,
  B01000,
  B01111,
  B10110,
  B10000,
  B11111,
  B01100,
  B01100
};

byte masina2[8] = {
  B11100,
  B00010,
  B11110,
  B01101,
  B00001,
  B11111,
  B00110,
  B00110
};


byte grad[8] = {
  B01110,
  B10001,
  B10001,
  B01110,
  B00000,
  B00000,
  B00000,
};

byte pom1[8] = {
  B00111,
  B01000,
  B10101,
  B10010,
  B10000,
  B01111,
  B00001,
  B00001
};

byte pom2[8] = {
  B11000,
  B00110,
  B10101,
  B01001,
  B00010,
  B11100,
  B10000,
  B10000
};



// variables 
// variabile 
int t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;


int temperaturePin1 = A0; // output from first LM335 is put at analog input no.0
int temperaturePin2 = A3; // output from second LM335 is put at analog input no.1
// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1

int divbaterie = A2; //the input pin for voltage divider
int u = 0;  // variable to store the value coming from the sensor
float k=4.90/5; // corection voltage (real voltage after 7805 output)
float k1 = k; // real divider correction

float u1 = 0; // voltage on battery
float divizor = 0.25; // divider raport

void setup() {
    lcd.begin(16,2);             // 16 characters, 2 rows
  lcd.createChar(0, grad);
  lcd.createChar(1, baterie1);
  lcd.createChar(2, baterie2);
  lcd.createChar(3, masina1);
  lcd.createChar(4, masina2);
  lcd.createChar(5, pom1);
  lcd.createChar(6, pom2);


 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("ATtiny85 dual"); // print a text
 lcd.setCursor(2, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("thermometer +"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen

 lcd.setCursor(0, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("+ battery status"); // print a text
 lcd.setCursor(4, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen

}


void loop() {

  // Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screen

for (int x=1; x <= 5; x++)
  {
// calculate the value  
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
 t10 = 100.0*(k*5.0*t1/1023-2.980)+25.0;
 t11 = t10 + t11;

t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
 t20 = 100.0*(k*5.0*t2/1023-2.980)+25.0;
 t21 = t20 + t21;

delay (500);
  }   

t12 = t11/5.0 -1.5 ; // average and corrected temperature  
t22 = t21/5.0 -1.0; // average and corrected temperature  

    lcd.setCursor(0, 0);
    lcd.write(byte(3));
    lcd.write(byte(4));
    lcd.print(":");
  //  lcd.print("t1="); 
    if (t12<10) lcd.print(" "); 
    if (t12>0.0) lcd.print("+"); 
    lcd.print(t12,1);
  //  lcd.write(0b11011111);
  lcd.write(byte(0));
    lcd.print("C ");
  
  
    lcd.setCursor(0, 1);
//   lcd.print("ext:");
  //  lcd.print("t2="); 
    lcd.write(byte(5));
    lcd.write(byte(6));
lcd.print(":");
    if (t22<10) lcd.print(" "); 
    if (t22>0.0) lcd.print("+"); 
    lcd.print(t22,1);
   // lcd.write(0b11011111);
   lcd.write(byte(0));
    lcd.print("C ");


 // read the value from the sensor:
  u = analogRead(divbaterie);      

u1 = k1*5.0*u/1023.0; // conver ADC in voltage value
u1 = u1/divizor+0.05;

lcd.setCursor(14, 0);
lcd.write(byte(1));
lcd.write(byte(2));
lcd.setCursor(11, 1);
  if (u1<10) lcd.print(" "); 
  lcd.print(u1,1);
  lcd.print("V"); 
}
   Ca marime, el nu este foarte mare fata de cel care avea doar termometru dublu:
   Am realizat montajul si am comparat cu un multimetru:
   Ca de obicei, am facut un filmulet.. numit termometru dublu cu indicare stare acumulator masina cu ATtiny85

luni, 26 ianuarie 2015

Termometru dublu cu ATTiny85

   Dupa ce am reusit sa "aprind" cu un ATtiny85 un afisaj alfanumeric LCD1602 prin intermediul unui registru de deplasare 74HC595, am zis sa fac si ceva util cu el. Am incercat pentru inceput sa preiau informatiile de la un senzor de uniditate si tenmperatura DHT11, dar nu am am reusit, apoi am incercat cu senzori de temperatura DS18B20 si rezultat negativ, asa ca am folosit placuta mea cu 2 senzori analogici LM335, pe care i-am folosit in proiecte anterioare cu Arduino, unul fiind cel prezentat in articolul Termometru dublu cu LM335Z si un afisaj LCD cu 16 coloane si 2 randuri
   Placuta cu cei 2 senzori LM335 are schema:
in care IC1 este senzorul de interior, care va fi conectat la A2 (pinul fizic 3 al lui ATtiny85), iar IC2 este senzorul de exterior, care va fi conectat la A3 (pinul fizic 2 al lui ATtiny85).
   Schema de conectare a lui ATtiny85 la afisaj este cea din articolul anterior:
   Montajul de test arata asa:
si are in partea din stanga jos un breadboad micut pe care se afla placa Arduino Nano, folosita la programare, si  ATtiny85,
acolo se afla si placuta adaptoare pentru cei 2 senzori, apoi este bradboard-ul mai mare pe care se gaseste registrul de deplasare 74HC595, mai sus se vede transformatorul de retea cu stabilizatorul de tensiune cu LM317 reglat la 5V si afisajul alfanumeric..
   De retinut: deoarece la senzorii analogici se compara tensiunea de pe intrare la care sunt conectati cu tensiunea de referinta si daca aceasta este tensiunea de 5V, la alimentarea din USB-ul unui calculator, din cauza consumului mare, citirile pot fi eronate, de aceea trebuie folosita o tensiune stabilizata de 5V.
- alimentare cu tensiune de 5V stabilizata:
- alimentare combinata (USB si stabilizator):
- alimentare doar din USB:
   Ca si la testele anterioare cu DHT11 si DS18B20, la compilare pentru ATtiny85 la 1MHz, primeam un mesaj de eroare:
   Dupa schimbarea placii la Arduino Uno, am constatat ca sketch-urile sunt mai mari de 4k si... am gasit pe net ca trebuie actualizat WinAVR-ul folosit de programul Arduino IDE... (toti pasii ce trebuie urmati sunt prezentati pe forumul Arduino in discutia http://forum.arduino.cc/index.php/topic,60649.0.html, eu nu am mai facut schimbari in fisierul avrdude.conf ).
   Dupa aceasta, compilarea este fara erori:
   Sketch-ul scris de mine este:
/*
this sketch is adapted by niq_ro from
http://www.tehnic.go.ro
http://www.niqro.3x.ro
http://nicuflorica.blogspot.ro/
http://arduinotehniq.blogspot.com/
for made a dual thermometer with ATtiny85 as Arduino..

 * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
 *     by Rowan Simms   code@rowansimms.com
 *     License: Creative Commons - Attribution.
 *     Full Documentation and Description:  http://rowansimms.com/article.php/lcd-hookup-in-seconds
 *
 * This sketch allows Arduinos to use a shift register to control an LCD, allowing 
 * a reduction in pins it requires from 6 to 3 while still retaining full control
 * including backlight on/off.
 * This requires the use of the LiquidCrystal595 library
 * available at: http://code.google.com/p/arduino-lcd-3pin/
 */

#include <LiquidCrystal595.h>    // include the library
LiquidCrystal595 lcd(0,1,2);     // datapin, latchpin, clockpin

byte home13[8] = {
  B00011,
  B00100,
  B01000,
  B11111,
  B01000,
  B01000,
  B01111,
};

byte home23[8] = {
  B00000,
  B10110,
  B01110,
  B11111,
  B00100,
  B00100,
  B11100,
};

byte home33[8] = {
  B00011,
  B10110,
  B01110,
  B11111,
  B00100,
  B00100,
  B11100,
};

byte home03[8] = {
  B11111,
  B00000,
  B00000,
  B11111,
  B00000,
  B00000,
  B11111,
};


byte grad[8] = {
  B01110,
  B10001,
  B10001,
  B01110,
  B00000,
  B00000,
  B00000,
};

// variables 
// variabile 
int t1, t2;
float t10, t20;
float t11, t21;
float t12, t22;


int temperaturePin1 = A2; // output from first LM335 is put at analog input no.0
int temperaturePin2 = A3; // output from second LM335 is put at analog input no.1
// cei 2 senzori de temperaturia LM335 sunt legati la pinii A0 si A1


void setup() {
    lcd.begin(16,2);             // 16 characters, 2 rows
 lcd.createChar(0, grad);
  lcd.createChar(1, home13);
  lcd.createChar(2, home23);
  lcd.createChar(3, home33);
  lcd.createChar(4, home03);

 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 2 and row 0 = left/up
 lcd.print("ATtiny85 dual"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 0 = left/down
 lcd.print("thermometer 1.0"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen

}


void loop() {
  
  // Read and store Sensor Data
t11=0;
t21=0;
//lcd.clear(); // clear the screen

for (int x=1; x <= 5; x++)
  {
// calculate the value  
t1 = analogRead(temperaturePin1); // read value from temperature from first sensor (LM335);
 t10 = 100.0*(5.0*t1/1023-2.980)+25.0;
 t11 = t10 + t11;

t2 = analogRead(temperaturePin2); // read value from temperature from second sensor (LM335);
 t20 = 100.0*(5.0*t2/1023-2.980)+25.0;
 t21 = t20 + t21;

delay (500);
  }   

t12 = t11/5.0 -1.5 ; // average and corrected temperature  
t22 = t21/5.0 -1.0; // average and corrected temperature  

    lcd.setCursor(2, 0);
    lcd.write(byte(1));
    lcd.write(byte(4));
    lcd.write(byte(3));
    lcd.print(":");
  //  lcd.print("t1="); 
    if (t12<10) lcd.print(" "); 
    if (t12>0.0) lcd.print("+"); 
    lcd.print(t12,1);
  //  lcd.write(0b11011111);
  lcd.write(byte(0));
    lcd.print("C  ");
  
  
    lcd.setCursor(2, 1);
    lcd.print("ext:");
  //  lcd.print("t2="); 
    if (t22<10) lcd.print(" "); 
    if (t22>0.0) lcd.print("+"); 
    lcd.print(t22,1);
   // lcd.write(0b11011111);
   lcd.write(byte(0));
    lcd.print("C  ");
    
delay(500);
lcd.setCursor(4, 0);
lcd.write(byte(2));
}
   Deoarece am fost bucuros ca mi-a iesit treaba, am facut la inceput 2 filme, nedandu-mi seama, ca temperaturile sunt inversate:
termometru dublu cu ATTiny85 folosind senzori LM335
ATtiny85 dual thermometer with LM335
   Ulterior, am facut corectii, facand alte 2 filme:
termometru dublu cu ATTiny85 folosind senzori LM335 (2)
ATtiny85 dual thermometer with LM335 (2)
   Am desenat si schema de conexiuni, completa:
27.01.2015
   Pastrand modul de desenare a cablajului din articolul de la Attiny_LCD_595 Board: LCD controlled by ATtiny85… stand-alone am desenat cablajul pentru schema de mai sus, utilizand programul Eagle PCB Software si, din graba, l-am gresit, ca sa fie functional, trebuie modificat astfel:

Comanda afisaj LCD1602 prin 3 fire

   Uzual, un afisaj alfanumeric LCD1602 se coneteaza la un microcontroler sau placa de dezvoltare prin 6 fire (DB7, DB5, DB5, DB4, E, RS), cum am prezentat, prima data, in articolul Arduino si un afisaj LCD clasic (16 caractere si 2 randuri).
   Ulterior eu am facut o placa adaptoare pe cablaj clasic, care are inclus semireglabilul de contrast, dupa cum am prezent in articolul Modul de conectare rapida a unui afisaj LCD1602 (HD44780) la Arduino sau alta placa de dezvoltare
   Pentru a reduce numarul de pini folositi se foloseste un registru de deplasare, gen 74HC594, HEF4094, etc, asa cum e prezentat si pe site-ul Arduino, in articolul 3 wires interface for LCD display
   Eu am incercat alta schema, pe care am gasit-o in articolul 3 Pin HD44780 LCD for Arduino scris de Rowan Simms:
   Am facut montaj cu un Arduino Nano:
   Schema lui Simms, redesenata in Eagle PCB Editor, la care am mai adaugat 2 rezistente (una de limitare curent in coletor si una pentru baza):
   Deoarece aveam de gand sa pun un ATtiny85 in locul placii Arduino, schema adaptoare ramane:
   Pentru a folosi prea multi pini, eu am mereu fundalul aprins:
iar conectarea la un ATtiny85 l-am facut asa:
   Am facut legaturile si am incarcat sketch-ul in ATtiny85, cum am prezentat in articolul Programarea unui microcontroler ATTiny85 cu sketch Arduino
   Am facut legaturile cu partea de montaj cu registrul de deplasare si am obtinut acelasi rezultat ca si cu placa Arduino:
   Sketch-ul folisit de mine, este cel din articolul lui Simms, doar cu modificarea pinilor de comanda, conform schemei realizate:
/*
 * 3-pin Arduino interface for HD44780 LCDs via 74HC595 Shift Register
 *     by Rowan Simms   code@rowansimms.com
 *     License: Creative Commons - Attribution.
 *     Full Documentation and Description:  http://rowansimms.com/article.php/lcd-hookup-in-seconds
 *     erata: see https://github.com/haiphamngoc/LiquidCrystal595 & http://haicuibap.ga/2013/12/ket-noi-lcd-voi-arduino-trong-6-giay/
or https://github.com/tehniq3/LiquidCrystal595
 * This sketch allows Arduinos to use a shift register to control an LCD, allowing 
 * a reduction in pins it requires from 6 to 3 while still retaining full control
 * including backlight on/off.
 * This requires the use of the LiquidCrystal595 library
 * available at: http://code.google.com/p/arduino-lcd-3pin/
 */

#include <LiquidCrystal595.h>    // include the library
LiquidCrystal595 lcd(0,1,2);     // datapin, latchpin, clockpin

void setup() {
    lcd.begin(16,2);             // 16 characters, 2 rows

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Wow. 3 pins!");
    lcd.setCursor(0,1);
    lcd.print("Fabulous");
}

void loop() {
    // not used.
}
   Nu trebuie sa uitati sa descarcati libraria LiquidCrystal595 si s-o copiati in directorul unde s-a instalat Arduino, la librarii..
   Sketch-ul este destul de mic, deci se poate folosi si pentru a afisa o tensiune, o temperatura, etc..


27.01.2014
   In stilul montajului prezentat in articolul Attiny_LCD_595 Board: LCD controlled by ATtiny85… stand-alone, care arata asa:
am desenat si eu o varianta asemanatoare de cablaj, utilizand programul Eagle PCB Software (si din graba il gresisesm, iar corecturi pentru a functiona sunt cele cu fire rosii...)
iar o "simulare 3D: