Sari la conținut
ELFORUM - Forumul electronistilor

Arduino UNO R3- display GeeKPi IIC/12C 2004 20x4


iker

Postări Recomandate

In primul rind,buna ziua tuturor!Urmaresc de ceva timp acest forum,si trebuie sa va spun ca sint surprins de cit de mult se poate invata,daca esti pasionat de lumea aceasta,si daca esti atent la ce se discuta in astfel de forumuri.

Ca sa nu ma certati foarte mult pentru intrebarile pe care am sa le formulez din cind in cind,trebuie sa recunosc ca in materie de elctronica stiu atit cit poate invata un autodidact care a inceput sa fie pasionat in acest domeniu pe vremea cind in Ro puteai sa ai doar un aparat de radio Cora,sau un televizor Venus,alb-negru,pe lampi,si nimic mai mult.

Azi am virsta de 54 de ani,si inca mai un vierme care ma maninca prin interior,as vrea sa mai am 100 de ani de viata,si sa invat tot ce exista in domeniile acestea noi,incepind cu programarea de orice tip,si terminind cu electronica.Din pacate in ziua de azi nu mai putem schimba lampi,si tranzistori,pur si simplu cumparam totul de-a gata.

Sa trec la subiect,ca sa nu va plictisesc.

Proiectul pe care il am in minte,este urmatorul.Lucrez cu un banc de probe common rail,o masinarie pe care se probeaza injectoare si pompe diesel,piese care se monteaza pe masinile pe care le conduceti majoritatea.

Bancul de probe,este fabricat 100% de mine,atit partea mecanica cit si cea de control digital,etc.

As vrea in acest moment,folosind Arduino,pe care nu il cunosc absolut deloc,dar vazind ce poate face,si intelegind modul in care lucreaza,mai mult sau mai putin,cum spuneam,as vrea sa folosesc Arduino ca sa imi ,,citeasca" milivoltii si sa imi afiseze in bar (presiune)

Am cumparat un kit,cred ca asa se numeste ,Arduino Uno R3,un display GeeKPi IIC/12C  20x4

Am gasit pe internet si am studiat foarte multe materiale in ce priveste proiectul meu,dar cum sint ZERO in programare,as vrea inainte de toate sa ma asigur,atit cit este posibil,ca ceea ce vreau sa fac este viabil.

Senzorul folosit este specific in common rail,in masini.Se alimenteaza cu 5v si in functie de presiune,pe un al treilea fir,scoate intre 0,5v si 4,5v dupa cum urmeaza:

0,5v=0bar

0,6v=50bar

0,7v=100bar

...................

3,8v=1600bar

La fiecare 0,1v de diferenta,presiunea este cu 50bar mai mare(sau mai mica)

Presiunea este in permanenta schimbare,urca si coboara in functie de cum merge injectorul,sau cum invirte pompa de injectie,dar in general vorbind urca si coboara cite 50...100bar.

As vrea ca citind tensiunea,sa apara pe display rezultatul in bar, pentru ca in acest moment citesc tensiunea pe un voltmetru digital,apoi trebuie sa ma uit in tabel sa vad la ce presiune corespunde,si este obositor.

Cum a zis un mare om de stiinta, ,,dati-mi un punct de sprijin,si va rastorn pamintul" in acelasi spirit,va rog sa imi dati o linie de cod,ceva,ca sa am un inceput,dupa care voi face probe,experimente,voi arde cite arduino va fi nevoie,apoi voi reveni ca sa va deranjez cu rezultatele obtinute,si cerind mai multe informatii.

Nu trebuie sa imi dati tot codul necesar,cu toate ca ar fi fenomenal,dar eu in acest moment am atit de multa informatie amestecata,ca pur si simplu nu stiu cu ce litera sa incep,sau ce sa modifc in codurile copiate dupa internet.

Multumesc anticipat,oricui interesat in acest subiect,si pentru orice fel de opinie,fie ea si negativa.

 

 

Link spre comentariu
  • Răspunsuri 21
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Cum citesti o tensiune: https://www.arduino.cc/en/Tutorial/BuiltInExamples/ReadAnalogVoltage

 

Si scrii pe un LCD (nu conteaza 4 sau 2 linii): https://create.arduino.cc/projecthub/akshayjoseph666/interface-i2c-16x2-lcd-with-arduino-uno-just-4-wires-273b24

 

NB: tinand cont ca vei castiga bani cu acest dispozitiv, era mai potrivit sa scrii la Servicii, caci din acest exemplu extrem de banal nu profita forumul, ci doar dta prin banii perceputi clientilor. 

Link spre comentariu

În principiu nu ai avea nevoie de un microcontroller, se poate realiza şi cu 2 divizoare rezistive, unul la ieşirea senzorului al doilea de la o referinţă de tensiune. Astfel poţi obţine o pantă de 1mV/bar, care se pot citi direct pe multimetru. Dacă însă vrei să foloseşti neapărat componentele cumpărate este relativ simplu de scris un program, ai nevoie de biblioteca de afişare pt. display senzorul se conectează la o intrare analogică apoi faci conversia valorilor cu funcţia map().

în funcţia loop() ai nevoie de ceva de genul:

int sensorRead = analogRead(A0); // CITESTE TENSIUNEA SENZORULUI
int bar = map(sensorRead, 102, 768, 0, 1600);  // TRANSFORMA DOMENIUL DE VARIATIE

Apoi faci afişarea folosind funcţile specifice bibliotecii afişajului, gen lcd.setCursor) şi lcd.Print.

Link spre comentariu

Se misca repede acest forum,multumesc pentru atentia acordata,sincer nu ma asteptam.

Mircea,imi cer scuze daca nu am postat unde trebuia,si iti explic de ce.Eu imi cistig painea cu aceasta masinarie de ceva ani buni,iar Arduino nu va face decit sa imi usureze munca,nu imi va da mai mult profit,prin urmare consider ca este doar o imbunatatire a ceea ce am deja,si fiind un electronist pasionat din copilarie,de dragul ,,artei"si ca sa nu mi se atrofieze creierul,din cind in cind mai fac si astfel de nebunii.Oricum,multumesc mult,sincer,fara ironie si nimic de genul acesta ca mi-ai atras atentia,si trebuie sa recunosc ca de asta imi era frica,sa nu fiu luat la misto,sau ironizat,pentru lipsurile si virsta mea.

Elison si MihaiCozac,deasemenea va multumesc pentru promptitudine.Am sa urmez toate indicatiile pe care mi le dati,ale tuturor,de altfel este singurul mod in care se poate invata fara a merge la facultate (la virsta mea nici ca as mai putea).

Ma apuc sa scriu si sa modific din codurile pe care le am,apoi le urc in Arduino,fac probe,si revin cu rezultatele.Cum zicea raposatul Edison, ,,nu am gresit de 100 de ori,din contra,am invatat 100 de moduri in care nu trebuie sa fac asa ceva".

Ne auzim curind,inca odata multumesc mult!

Link spre comentariu

Buna ziua,si Paste fericit celor care il sarbatoresc.

Am facut probe cu ce mi-ati recomandat,plus alte citeva copy-paste dupa internet,si pare totul ok,doar ca am o alta problema.

Nu stiu daca este din delay ori este din altceva.

Pe lcd imi afiseaza 3 digiti,numai ca ultimii doi,cum se schimba la viteza mare,nu sint inteligibili.

Am pus delay la 20000 si nu prea vad vreo schimbare semnificativa.O idee,ceva,pe unde sa bag mina?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // adresa display 0x27
int presiune;
void setup()
{
  lcd.begin(20, 4);                      // initializare afisaj
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Afisare Presiune");
  delay(20000);
  lcd.clear();
}


void loop()
{
  presiune = analogRead(A0); //senzor de presiune conectat la pin A0
  // tensiunile sub 0.5V si cele peste 4,5V nu sunt luate in considerare
  if (presiune <102) presiune=102;
  if (presiune>920) presiune=920;
  presiune= map(presiune,102,920,0,2000);// mapare presiune
  if (presiune<1000){
                    lcd.setCursor(4,0);
                    lcd.print(" ");
                    lcd.print(presiune);
  }
  if (presiune>=1000){
                    lcd.setCursor(4,0);
                   
                    lcd.print(presiune);
  }
  lcd.setCursor(9,0);
  lcd.print("Bar");
}

 

Link spre comentariu

Intarzierea actioneaza o singura data, la initializarea LCD-ului dupa cum ati pus-o in program. Iar initializarea se face o singura data, cand alimentati montajul. 

 

Intarzierea trebuie pusa intre citiri (masuratori). 

 

Sa zicem, inainte de functia AnalogRead. Dar se poate pune si dupa. Oriunde in bucla principala. 

Link spre comentariu

în mod normal întrzierea se pune imediat după afişare daca rata de afişare e prea mare. 0.5 - 1 sec e suficient.

 

Sau, o chestie un pic mai complicată, programul merge normal, cu zeci de citiri pe secundă ale senzorilor (timp in care se dau şi comenzile în funcţie de datele citite de la senzori) numai că afişarea se face o dată la 0,5 - 2 secunde. Este utilă în locurile unde anumite valori variaza rapid iar microcontrolerul trebuie sa ia repede decizii în timp ce afişarea e lăsată pe locul 2.

Link spre comentariu

adica scoti delay(20000); din setup.
iar in loop() poti sa pui ceva de genul:
 

void loop()
{
  presiune = analogRead(A0);
  presiune = constrain(presiune, 102, 920);
  presiune = map(presiune,102,920,0,2000);
  lcd.setCursor(4,0);
  if (presiune<1000) lcd.print(" ");
  lcd.print(presiune);
  lcd.setCursor(9,0);
  lcd.print("Bar");
  delay(1000);						// aici delay
}


tot aia face dar mai scapi de niste if-uri si devine mai usor de urmarit codul.
LE: Tema 'pentru acasa':
Mai adaugi o variabila old_presiune, compari, si afisezi doar daca valoarea noua difera de cea anterioara.
 

Editat de Vizitator
Link spre comentariu

N-am testat hardware... dar poti incerca asta:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // adresa display 0x27, coloane, linii
int presiune;
void setup()
{
  lcd.clear();
  lcd.begin(20, 4);                      // initializare afisaj
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Afisare Presiune");
  delay(1000);
}
void loop()
{
  presiune = analogRead(A0); //senzor de presiune conectat la pin A0
  // tensiunile sub 0.5V si cele peste 4,5V nu sunt luate in considerare
  if (presiune <102) presiune=102;
  if (presiune>920) presiune=920;
  presiune= map(presiune,102,920,0,2000);// mapare presiune
  lcd.setCursor(4,1);
  if (presiune > 999);
  else if (presiune > 99) lcd.print(" ");
  else if (presiune > 9)  lcd.print("  ");
  else lcd.print("   ");
  lcd.print(presiune);  
  lcd.setCursor(9,1);
  lcd.print("Bar");
  delay(500);           //citire la 0,5 secunde
}

Citirea se face la 0,5 secunde, daca vrei mai rapid, modifici linia cu "delay(500)".

Am incercat alinierea la dreapta a afisarii, pentru o stabilitate buna.

 

Succes!

Link spre comentariu
15 minutes ago, cimitavita said:

în mod normal întrzierea se pune...

De acord cu principiul expus de dvs, insa la programul de fata, se poate pune absolut oriunde, nu schimba nimic.

 

8 minutes ago, Liviu.Mihaiu said:

LE: Tema 'pentru acasa':

Mai adaugi o variabila old_presiune, compari, si afisezi doar daca valoarea noua difera de cea anterioara.

Asta a solutia cea mai eleganta (si o folosesc mereu - daca nu fac medieri), insa tot exista riscul ca ultimii digiti sa joace.

Link spre comentariu
5 minutes ago, Mircea said:

insa tot exista riscul ca ultimii digiti sa joace.

Acum am vazut si eu.
Posibil sa joace si din cauza acelei incercari de pading left cu if presiune<1000 print " ".
Si daca este 10 ? sau 1 ?
A pomenit cineva mai sus variantele.


 

Link spre comentariu

Multumesc mult!Acum pare ok,se poate citi fara probleme,am sa las codul asa cum il am ca poate ajuta si pe altii.Nu stiu insa daca trebuia sa sterg primul delay ,eu l-am lasat si am adaugat un altul inainte de AnalogRead,iar pe deasupra am micsorat de la 20.000 la 2000 cum era initial.

Mai as avea nevoie de ajutor pentru o mai buna calibrare.

Datele care le folosesc in acest moment sint copy paste,nu sint preluate de la masuratorile mele reale.

Din cite inteleg eu,trebuie sa fac masuratori reale pe sensorul real,modificind codul,in asa fel incit sa citesc pe serial datele,dupa care sa rescriu codul si sa specific de exemplu la tensiune=0,5v presiunea=0bar apoi la tensiune=3,8v presiune=1600bar

Nu sint inca sigur la cit sa impart 1024 si de ce?Impartit la 4?Dar de ce la acest numar,de ce nu la altul?Inteleg ca ar avea legatura cu ,,bitzi" de transmisie,asa este?Rezultatul 256 (nu stiu de ce imi tot suna numarul asta) ce fac cu el??Impart presiunea de 1600bar la 256? Rezultatul de 6,25 ar insemna in acest caz,la fiecare milivolt de diferenta,voi avea 6,25bar diferenta?Matematic vorbind,asta ar fi explicatia,dar nu sint sigur,si inteleg mai greu.

Pina aici cit de cit cred ca am inteles,ce ar trebui sa fac,si de ce trebuie sa fac,dar ma opintesc mereu si nu inteleg cum ar trebuie sa fie codul,sub ce forma.

Cu scuzele de rigoare pentru putinele cunostinte pe care le am,va las codul asa cum il am in acest moment,si am sa mai revin in functie de ce voi mai descoperi facind teste.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // adresa display 0x27
int presiune;
void setup()
{
  lcd.begin(20, 4);                      // initializare afisaj
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Afisare Presiune");
  delay(2000);
  lcd.clear();
}


void loop()
{
  delay(2000);
  presiune = analogRead(A0); //senzor de presiune conectat la pin A0
  // tensiunile sub 0.5V si cele peste 4,5V nu sunt luate in considerare
  if (presiune <102) presiune=102;
  if (presiune>920) presiune=920;
  presiune= map(presiune,102,920,0,2000);// mapare presiune
  if (presiune<1000){
                    lcd.setCursor(4,0);
                    lcd.print(" ");
                    lcd.print(presiune);
  }
  if (presiune>=1000){
                    lcd.setCursor(4,0);
                   
                    lcd.print(presiune);
  }
  lcd.setCursor(9,0);
  lcd.print("Bar");
  }

 

Link spre comentariu
Acum 38 minute, Liviu.Mihaiu a spus:

adica scoti delay(20000); din setup.
iar in loop() poti sa pui ceva de genul:
 

void loop()
{
  presiune = analogRead(A0);
  presiune = constrain(presiune, 102, 920);
  presiune = map(presiune,102,920,0,2000);
  lcd.setCursor(4,0);
  if (presiune<1000) lcd.print(" ");
  lcd.print(presiune);
  lcd.setCursor(9,0);
  lcd.print("Bar");
  delay(1000);						// aici delay
}


tot aia face dar mai scapi de niste if-uri si devine mai usor de urmarit codul.
LE: Tema 'pentru acasa':
Mai adaugi o variabila old_presiune, compari, si afisezi doar daca valoarea noua difera de cea anterioara.
 

Am pus delay si la inceput si la sfirsit,in void loop()si am probat,in ambele cazuri merge fara probleme.

In ce priveste adaugarea unei alte variabile,nu mi-o luati in nume de rau,de moment sint doar un copy paste_man,incerc si eu acolo,cit ma duce mintea,mai modific o litera,mai un numar,mai o virgula,dar pina la a trece la urmatorul pas,adica programare,...

De moment copiez coduri dupa internet,si le probez ca sa inteleg cum functioneaza.

Oricum,eu va multumesc tuturor pentru interes,si pentru ajutor,si mereu citesc fiecare raspuns primit,apoi il recitesc,si ca sa fiu sigur ca am inteles,il tot recitesc,iar intre timp incerc sa aflu ce a vrut sa spuna cel care a postat mesajul,si tot facind asta,mai invat ite ceva nou,apoi imi vin alte idei,si uneori nu mai merg nici sa maninc.

Link spre comentariu

Totusi este bine , daca tot esti incepator, sa ti cont de ce mai spun si altii.
Nu este logic sa incepi bucla loop() cu un delay.
Adica  nici nu te-ai apucat bine de treaba si incepi cu o pauza.

 

Link spre comentariu
Vizitator
Acest subiect este acum închis pentru alte răspunsuri.



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări