Sari la conținut
ELFORUM - Forumul electronistilor

Modificare voltmetru


theborg

Postări Recomandate

MifTy. nu a zis nimeni ca fara un controler suplimentar. Dar sunt LCD1602 care vin cu controlerul ala onBoard, si mai sunt si separat, pe care le lipesti tu acolo. Asa cum ziceam "daca folosesti un 1602 cu i2c", deci cred ca am fost clar, ca are controlerul i2c pe el. Pretul acestuia e neglijabil, cel putin ptr mine. ~10Roni

 

apropo de fite inutile. asa ni s-a parut multa vreme si telefoanele mobile. o fita inutila :) si poate chiar asta si sunt.

doar ca...ne-am cam obisnuit cu ele :)

Editat de Vizitator
Link spre comentariu
  • Răspunsuri 58
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • theborg

    17

  • djvas

    8

  • MifTy

    8

  • UDAR

    3

Top autori în acest subiect

Imagini postate

...

Pe partea de programare, eu ca farmacist de profesie ma limitez doar la a "fura" coduri facute de altii si a le aplica, eventual a face mici modificari prin ele.

...

Sunt in ceata... am intrat prin programare, prin controlere, prin i2c si pe mine m-ati pierdut...

In fine, am folosit codul de mai jos al voltmetrului gasit pe net la care am modificat in loc de value=value*0.978; eu am trecut value=(1.2 * value - 0.6) / 4; si imi arat acum valoarea de 0.02.

Maine dimi conectez senzorul la presiune si in comparatie cu un manometru analogic voi compara rezultatele.

#include<LiquidCrystal.h>int vin=A0;float value;LiquidCrystal lcd(12,11,5,4,3,2); //library initializationvoid setup(){  pinMode(vin,INPUT);  lcd.begin(16,2);  lcd.setCursor(1,0);  lcd.print("LCD VOLTMETER");}void loop(){value=analogRead(vin);value=value/200;value=(1.2 * value - 0.6) / 4;lcd.setCursor(3,1);lcd.print(value);lcd.print(" volts");delay(300);}
Link spre comentariu

MifTy. nu a zis nimeni ca fara un controler suplimentar. Dar sunt LCD1602 care vin cu controlerul ala onBoard, si mai sunt si separat, pe care le lipesti tu acolo. Asa cum ziceam "daca folosesti un 1602 cu i2c", deci cred ca am fost clar, ca are controlerul i2c pe el. Pretul acestuia e neglijabil, cel putin ptr mine. ~10Roni

 

apropo de fite inutile. asa ni s-a parut multa vreme si telefoanele mobile. o fita inutila :) si poate chiar asta si sunt.

doar ca...ne-am cam obisnuit cu ele :)

 

asta nu ştiam.am văzut eu "I2C LCD display for Arduino", dar îmi părea un LCD "normal" plantat pe o plăcuţă cu un controller care pe de-o parte primea comenzile I2C, pe de alta le decoda şi comanda pinii LCD-ului în mod normal...nu ştiam că există afişaje LCD cu controller I2C integrat...cât priveşte "fiţa Arduino", ne contrazicem pe topicul lui dedicat, bine? :)@theborg, dacă vrei să înveţi să programezi un mcu atmel, oricare, mai bine învaţă să programezi în asm sau C, la alegere, altfel codul tău o să fie totdeauna dependent de un Arduino şi de Arduino IDE!

Link spre comentariu

pai ce e asta aici "value=value/200;" ?

ce ai scris acolo probabil are legatura cu schema fizica, cu vreun divizor rezistiv, sau de genul..dar nu poti calcula ...asa..

eventual

 

value =  (value * 0.0048875855327468L);

 

dar value e float si...analogRead returneaza int..

ma rog..

 

pinii trebuie sa-i declari fie cu

  const int vin = A0;

fie cu #DEFINE

 

cât priveşte "fiţa Arduino", ne contrazicem pe topicul lui dedicat, bine? :)

nu ma contrazic..dar bine. :)

@theborg, dacă vrei să înveţi să programezi un mcu atmel, oricare, mai bine învaţă să programezi în asm sau C, la alegere, altfel codul tău o să fie totdeauna dependent de un Arduino şi de Arduino IDE!

 

sa mai contrazic si aici ? nu...

dar poti sa mai cauti informatie...poti sa scri orice AVR vrei tu cu ArduinoIDE. Dar bineinteles ca nu cu ArduinoIDE asa cum vine de la mama lui. Mai trebuiesc putine ajustari, dar nu cine stie ce. In general Mape pentru pini, si fuses.

Editat de Vizitator
Link spre comentariu

pai ce e asta aici "value=value/200;" ?

ce ai scris acolo probabil are legatura cu schema fizica, cu vreun divizor rezistiv, sau de genul..dar nu poti calcula ...asa..

eventual

 

value =  (value * 0.0048875855327468L);

 

dar value e float si...analogRead returneaza int..

...

Schema este de aici

post-194063-0-70112400-1449903854_thumb.png

Editat de theborg
Link spre comentariu

Ca si schema electronica, nu e cine stie ce: alimentez senzorul la 5v iar iesirea o trimit direct in Arduino UNO care trebuie sa-mi afiseze presiunea in plaja interesata de mine intre 0 si 3 bar de preferat cu 2 zecimale dar nu cu precizie de 0,01 ci o precizie de 0,05 fiind arhisuficienta.

 

Nu vreau sa te dezamagesc dar nu vei putea obtine nici macar 0.05% precizie in configuratia clasica de arduino cu referinta de 5V.

Link spre comentariu

Am inlocuit in cod value=value/200 cu value * 0.0048875855327468L valoarea value=(1.2 * value - 0.6) / 4 am inmultit-o cu 10 ca sa-mi afiseze in bari nu in MPa.

La 0 bari imi apare indicata valoarea de 0.45-0.48 in loc de 0.00 si la o presiune de cca 2.25 imi apare 2.75-2.78. Cum scap de acest decalaj de aprox 0.5?

Link spre comentariu

Imi apare eroare la compilare, si cum nu ma pricep la programare ca sa rectific...

C:UsersBorgAppDataLocalTempbuild8149516683302858902.tmp/core.a(main.cpp.o): In function `main':C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/main.cpp:40: undefined reference to `setup'C:Program Files (x86)Arduinohardwarearduinoavrcoresarduino/main.cpp:43: undefined reference to `loop'collect2.exe: error: ld returned 1 exit statusError compiling.
Link spre comentariu

pai :) ...eu nu ti-am dat cod complet, sunt doar doua functii.. trebuia sa le pui in proiectul tau.

 

ok, iti fac cod complet, desi nu era mare branza.

const int senzorPin = A0;int RawADC = 0;float P,U = 0.0;void setup(){  analogReference(DEFAULT); // poti sapa putin dupa chestia asta.  //pinMode(senzorPin,INPUT); // nu este necesar sa declari intrarile analog.  Serial.begin(9600);    Serial.println(F("Initializare sistem"));}void loop(){ citescSenzor(); delay(100);}void citescSenzor(){/* Prima data calibrezi bine de tot tensiunea citita pe A0 sa corespunda cu 0,5V..4.5V in soft.*/ RawADC = analogRead(senzorPin); U = RawADC * (4.98 / 1023.0); // 5.0 poate fi 4.98 e tensiunea sursei uCSerial.print(F("RawADC")); Serial.println(RawADC);  Serial.print(F("tTensiune:")); Serial.println(U);/*Apoi convertesti*/P  = (1.2 * U - 0.6) / 4;/* Si afisezi in consola, deocamdata */Serial.print(F("Presiune:")); Serial.println(P); /* Poti incerca si varianta cu fmap()*/ P = fmap(U,0.5,4.5,0.0,1.2); Serial.print(F("Presiune2:")); Serial.println(P); Serial.println("");}/* fmap e o functie putin modificata */ float fmap(double x, double in_min, double in_max, double out_min, double out_max){  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;}

Lasa deocamdata LCD-ul. Foloseste consola pe 9600

Editat de Vizitator
Link spre comentariu

pai...conform testelor, una din variantele "Presiune", "Presiune2" ar trebui sa arate eronat fata de masuratoarea ta.

care varianta arata mai aproape de masuratoarea ta ?

 

doar una trebuie integrata in aplicatie.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • 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