marți, 1 septembrie 2015

Afisaj LDC cu interfata I2c si senzor brick LM50 !

 Am vrut sã scap de cablarea cu fire multe dintre LCD şi Arduino şi mi-am propus sã fac o aplicaţie cu interfaţa I2C. 
 Toate bune şi frumoase , pânã am instalat librãria LiquidCrystal_I2C  şi am constatat cã existã diferenţe faţã de LiquidCrytsal .

Am încercat exemplele “CustomChars.ino” şi “Hello World.ino” din LiquidCrystal_I2C; 
Apoi , am încercat  sã adaptez la I2C  şi exemplele din LiquidCrystal, ca sã mã familiarizez  cu modul de lucru.
Si pentru cã aveam un senzor LM50, am trecut la încercãri.
Ca întotdeauna, am cãutat mai întîi pe modele lucrate de  altcineva  – mi-am zis cã e mai comod.
Am gãsit un exemplu pe:
l-am încercat cu afişare pe SerialMonitor  şi apoi l-am modificat  la afişarea pe LCD I2C.

Cea mai buna bibliografie, pentru explicarea algoritmului 
şi calculelor matematice este pe  site-ul :
ttp://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31.Tot de aici am preluat şi inaginea paginii 31, cu caracteristicile senzorului LM50 :



............................................................................................................................................
Conexiuni
De la modulul I2c, pinul  SDA  la pinul  A4 de la Ardu Uno
De la modulul I2c , pinul SCL la pinul A5 Ardu Uno
De la Brickul LM50, pinul Out la pinul A0  Ardu Uno

GND – este comun ; Vcc la +5v, comun
............................................................................................................................................

Codul modificat şi complectat (am blocat afişarea pe Serial Monitor ) este redat mai jos :
//…………………………………
//temperaturaC_I2C.ino
//…………………………………
#include <Wire.h>
#include <LiquidCrystal_I2C.h>   
// cu senzor brick LM 50
// am plecat de la schita de pe Robofun cu LM50 si
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf  pagina 31
//  am adaugat cod pentru afisare pe LCD I2C 16x2
//.......................................
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup(){
 // Serial.begin(9600);
     lcd.init();                      // initialize the lcd
     lcd.backlight(); 
    // Print a message to the LCD.
     lcd.print("Temperatura: ");  
}

void loop(){
 Serial.print("Temperatura: ");
  float temperatura = readTempInCelsius(10,0); //apeleaza functia, cu 10 citiri pe pinul analg A0)
// functia returneaza media a 10 citiri succesive
lcd.setCursor(0,1);
lcd.print(temperatura);
lcd.setCursor ( 6, 1 ); // sare pe linia 2
lcd.print((char)223); // Tipareste cerculetul de la grade Celsius  pe linia 2
lcd.setCursor ( 7, 1 ); // sare pe linia 2
lcd.print("C");
 // Serial.print(temperatura);
 // Serial.print("  ");
  //Serial.write(176);
  //Serial.println("C");
  //delay(200);
  delay(1000);
}

// functia pentru citirea temperaturii , referinte :http://www.robofun.ro/senzor-temperatura-brick
//http://users.utcluj.ro/~rdanescu/pmp-c08.pdf exemplu pagina 31
float readTempInCelsius(int count, int pin) { //unde count= numarul de citiri; la pin-ul specigicat-0
       
        float sumaTemperatura;
        for (int i =0; i < count; i++) { // pentru i de la 1  la 10
            int reading = analogRead(pin);  // citeste pinul analog 0
            float voltage = reading * 5.0;  // 5 este rezolutia la tensiunea de referinta 5V pt Arduino Uno
            voltage /= 1024.0; // imparte la rezolutie senzor
            float temperatureCelsius = (voltage - 0.5) * 100 ; //scade deplasament
            sumaTemperatura = sumaTemperatura + temperatureCelsius;
            }
          return sumaTemperatura / (float)count; //calculeaza media
          }


Succes la cine doreşte sã  încerce !





























Niciun comentariu:

Trimiteți un comentariu