Jump to content
ELFORUM - Forumul electronistilor

Ajutor corectare


vasile eugen

Recommended Posts

Salutare.Am inceput  sa iau exemple de pornire de pe net.Am reusit  un exemplu  cu senzorul DHT11 care sa-mi arate  valorile pe terminal serial ,dar pe lcd 2*16   nu reusesc sa il compilez.Undeva   gresesc dar tot nu am reusit.Codul care l-am incercat este:

#include <DHT11.h>
//Declare objects
dht11 DHT11;
//Pin Numbers
#define DHT11PIN 2
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  dht.begin();
}
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  }
  else {
    lcd.setCursor(0, 0);
    lcd.print("Temp=");
    lcd.print(t);
    lcd.print(" *C");
    lcd.setCursor(0, 1);
    lcd.print("Humidity=");
    lcd.print(h);
    lcd.print("% ");
    delay(500);
  }
}
Link to comment
  • Replies 13
  • Created
  • Last Reply

Top Posters In This Topic

  • Xaby

    5

  • vasile eugen

    3

  • Liviu M

    2

  • Elison

    1

Top Posters In This Topic

  • 9 months later...

Postez aici sa nu mai deschid un alt threat.

Vreau sa fac un termometru cu arduino, 2 ds18b20 si lcd 16x2.

Am codul afiseaza temperaturile dar cand temperatura scade sub10 imi apare 9 si nu 09.

cum pot sa fac sa apara cu 0 in fata? Multumesc.

#include <OneWire.h>#include <DallasTemperature.h>// Data wire is plugged into pin 2 on the Arduino#define ONE_WIRE_BUS 8// Setup a oneWire instance to communicate with any OneWire devices // (not just Maxim/Dallas temperature ICs)OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature.DallasTemperature sensors(&oneWire);DeviceAddress Probe01 = {   0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E }; DeviceAddress Probe02 = {   0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9 };/*  The circuit:   LCD RS pin to digital pin 2   LCD Enable pin to digital pin 3   LCD D4 pin to digital pin 4   LCD D5 pin to digital pin 5   LCD D6 pin to digital pin 6   LCD D7 pin to digital pin 7   LCD R/W pin to ground   10K resistor:   ends to +5V and ground   wiper to LCD VO pin (pin 3)*/// include the library code:#include <LiquidCrystal.h>// initialize the library with the numbers of the interface pinsLiquidCrystal lcd(2, 3, 4, 5, 6, 7);int LEDPin = 13; //digital pin output for lightbyte celsius[8]={  0b01100,  0b10010,  0b10010,  0b01100,  0b00000,  0b00000,  0b00000,  0b00000};void setup() {  // start serial port to show results  Serial.begin(9600);  Serial.print("Initializing Temperature Control Library Version ");  Serial.println(DALLASTEMPLIBVERSION);  // Initialize the Temperature measurement library  sensors.begin();  // set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)  sensors.setResolution(Probe01, 9);  sensors.setResolution(Probe02, 9);  lcd.begin(16, 2);  lcd.print("Dual Thermometer");  delay (500);  lcd.clear();  pinMode(13, OUTPUT);  lcd.createChar(1,celsius);}void loop(){   Serial.println();  Serial.print("Number of Devices found on bus = ");    Serial.println(sensors.getDeviceCount());     Serial.print("Getting temperatures... ");    Serial.println();     // Command all devices on bus to read temperature    sensors.requestTemperatures();    Serial.print("Probe 01 temperature is:   ");  printTemperature(Probe01);  Serial.println();  Serial.print("Probe 02 temperature is:   ");  printTemperature(Probe02);  Serial.println();  }//--(end main loop )---/*-----( Declare User-written Functions )-----*/void printTemperature(DeviceAddress deviceAddress){  float temp1 = sensors.getTempC(Probe01);  float temp2 = sensors.getTempC(Probe02);  float tempC = sensors.getTempC(deviceAddress);  if (tempC == -127.00)   {    Serial.print("Error getting temperature  ");  }   else  {    Serial.print("C: ");    Serial.print(tempC);  }  lcd.setCursor(0, 0);  lcd.print("I:");  lcd.print(temp1, 1);  lcd.setCursor(6, 0);  lcd.write(1);  lcd.print("C");  lcd.setCursor(0, 1);  lcd.print("O:");  lcd.print(temp2, 1);  lcd.setCursor(6, 1);  lcd.write(1);  lcd.print("C");}// End printTemperature//*********( THE END )***********
Edited by Xaby
Link to comment

...

Am codul afiseaza temperaturile dar cand temperatura scade sub 10 imi apare 9 si nu 09.

cum pot sa fac sa apara cu 0 in fata? 

...

 

 

In prima faza - exact cum ai scris:

lcd.print("I:");if (temp1<10) lcd.print('0');  // linie adaugata lcd.print(temp1, 1); 

la fel si la temp2.

 

Linia nou adaugata o putem "traduce" astfel: daca variabila temp1 contine o valoare mai mica decat zece atunci,  si numai atunci, executa instructiunea  lcd.print - tipareste un zero.

Edited by rlodina
Link to comment

Am  adaugat linia noua acum este ok cand valoarea este pozitiva(apare 09.5).

Problema este cand temperatura este negativa. Atunci imi apare -9.5 si nu -09.5.

Cum fac si la valori negative?

Link to comment

M-am gandit la 2 metode.

Prima metoda:

lcd.print("I:");  lcd.setCursor(2, 0);  if (temp1 <0) lcd.print('-');   else if (temp1 >0) lcd.print('+');   if (temp1 <0) temp1=-temp1;   if (temp1 <10) lcd.print('0');    lcd.print(temp1, 1);

A doua metoda:

lcd.print("I:");  lcd.setCursor(2, 0);  if (temp1 <0) lcd.print('-');  else if (temp1 >0) lcd.print('+');   if (temp1 <0) temp1=temp1*-1;   if (temp1 <10) lcd.print('0');  lcd.print(temp1, 1);

Amandoua metode functioneaza.

Care ar fi mai ok? Sau exista alta metode?

Link to comment

Eu inclin spre ultima varianta pentru ca este mai logica.

Intr-un final urmareste care dintre programe ocupa mai putina memorie.

Si,

pune un millis() inainte si unul dupa secventa de cod si vezi timpul de executie pentru fiecare (diferenta dintre cele doua valori millis() ).

Vei afla astfel care varianta consuma mai mult timp de procesor.

Link to comment

De ce nu grupezi cele doo if(temp1<0)?

In rest, dupa parerea mea, cele doua variante sunt perfect identice. Cand scrii temp1 = -temp1 compilatorul face pentru tine fix operatia temp1=temp1*(-1).

Cel putin asa cred. :rade:

Edited by Liviu M
Link to comment

Faptul ca tu scrii o data cu * si o data fara nu impiedica compilatorul sa faca operatia pentru tine.

Ca fapt divers, am testat cele doua variante si ocupa aceeasi cantitate de memorie.

Grupat adica:

  lcd.print("I:");  lcd.setCursor(2, 0);  if (temp1 <0) {    lcd.print('-');     temp1=-temp1;  }  else if (temp1 >0) lcd.print('+');   if (temp1 <10) lcd.print('0');    lcd.print(temp1, 1);

Cele doo sketchuri de test:

void setup() {  // put your setup code here, to run once:}void loop() {  // put your main code here, to run repeatedly:  uint8_t i = 1;  i = i * (-1);  Serial.println(i);}
void setup() {  // put your setup code here, to run once:}void loop() {  // put your main code here, to run repeatedly:  uint8_t i = 1;  i = -i;  Serial.println(i);}

Rezultatul, in ambele cazuri:

Sketch uses 1,788 bytes (5%) of program storage space. Maximum is 32,256 bytes.Global variables use 200 bytes (9%) of dynamic memory, leaving 1,848 bytes for local variables. Maximum is 2,048 bytes.
Edited by Liviu M
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines