Sari la conținut
ELFORUM - Forumul electronistilor

Termometru cu DS18B20 si Digiti LED


GeoMar

Postări Recomandate

Acum 22 ore, deejay2k1 a spus:

...

sau mai bine pune lucrurile in ordine :)


//====== Temperatura 2 =========
  senzori.requestTemperatures();
  t2 = senzori.getTempC(senzor2);
  Serial.print("Temp C: ");
  Serial.println(t2);

  scrollMessage(temperatura2);
  if (t2 > 0.0f)
  {
    loadBufferLong(43);  // +
  }
  else
  {
    loadBufferLong(45);  // +
    t2 = -t2;
  }

  int t2a = 10 * t2;
  int tz2 = t2a / 100;
  t2a = t2a - tz2 * 100;
  int tu2 = t2a / 10;
  int ts2 = t2a % 10;

  Serial.print("=");
  Serial.print(tz2);
  Serial.print(tu2);
  Serial.print(",");
  Serial.print(ts2);
  Serial.println(" C");

  loadBufferLong(48 + tz2); // 2
  loadBufferLong(48 + tu2); // 1
  loadBufferLong(44);  // ,
  loadBufferLong(48 + ts2); // 7
  loadBufferLong(0x7F);  // degree sign
  loadBufferLong(67);  // C
  delay(2000);

 

M-am conformat si am pus lucrurile in ordine, multumesc frumos  deejay2k1 cu aceasta modificare afiseaza corect tensiunile negative.  :aplauze:aplauze

Dupa implementarea in cod a modificarii propuse de tine, am remarcat ca la temperaturi intre 9,9 grade si -9,9 grade, afisa si un 0 in fata temperaturei, ceva gen
- 03,8 grade, in loc de - 3,8 grade. Destul de urata/inestetica aceasta afisare cu acel 0 in fata.

Pentru a nu mai afisa acel 0 in fata, am inclus in cod, partea de cod de mai jos, parte care se ocupa de "stingerea" acelui 0 la temperaturi intre 9,9 si - 9,9 grade:

[code]
  if ((t3 < 10) || (t3 < (-10)))
  {
    loadBufferLong(32 + tz3); // 2
  }
  else
  {
    loadBufferLong(48 + tz3); // 2
  }

[/code]

Nu stiu insa daca este cea mai buna modalitate pentru "anularea-stingerea" acelui 0 din fata temperaturei, dar functioneaza, asa ca partea de citire-afisare temperatura a unui senzor Ds18B20 arata acum asa:

[code]
  //====== Temperatura 2 =========
  senzori.requestTemperatures();
  t2 = senzori.getTempC(senzor2);
  Serial.print("Temp C: ");
  Serial.println(t2);

  scrollMessage(temperatura2);
  if (t2 > 0.0f)
  {
    loadBufferLong(43);  // +
  }
  else
  {
    loadBufferLong(45);  // -
    t2 = -t2;
  }

  int t2a = 10 * t2;
  int tz2 = t2a / 100;
  t2a = t2a - tz2 * 100;
  int tu2 = t2a / 10;
  int ts2 = t2a % 10;

  Serial.print("=");
  Serial.print(tz2);
  Serial.print(tu2);
  Serial.print(",");
  Serial.print(ts2);
  Serial.println(" C");

  if ((t2 < 10) || (t2 < (-10)))
  {
    loadBufferLong(32 + tz2); // 2
  }
  else
  {
    loadBufferLong(48 + tz2); // 2
  }
  loadBufferLong(48 + tu2); // 1
  loadBufferLong(44);  // ,
  loadBufferLong(48 + ts2); // 7
  loadBufferLong(0x7F);  // degree sign
  loadBufferLong(67);  // C
  delay(1000);

[/code]

 

O poza cu afisare temperatura negativa:

-3_8_grade.jpg

 

Si un mic clip cu functionarea montajului:

 

L.E.

Urmeaza sa experimentez acum implementarea pe un port ADC a unei fotorezistente care sa comande intensitatea luminoasa a afisajului in functie de iluminare.
Ceva idei-exemple sunt binevenite.

Editat de GeoMar
Link spre comentariu
  • Răspunsuri 45
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • GeoMar

    22

  • deejay2k1

    4

  • cimitavita

    4

  • costi002

    3

Top autori în acest subiect

//+5V - LDR, AnalogPin - resistor - GND
// LdrDarkResistance = 500 kOhm
// LdrLightResistance = 10kOhm
// resistorValue = 47kOhm
#define LDRpin A0 // ajusteaza dupa schema

  // periodic ....
const int darkLdrVoltage = 87; //429mV ~ 87, ajusteaza dupa caz (divizor resitiv)
const int brightLdrVoltage = 843; // 4.123V ~ 843, ajusteaza dupa caz
int intensityValue = map(analogRead(LDRpin), darkLdrVoltage,brightLdrVoltage,0x01,0x0f);
intensityValue = constrain(intensityValue,0x01,0x0f);
mx.control(MD_MAX72XX::INTENSITY, intensityValue);

apeleaza bucata de dupa //periodic .... periodic. Ar trebui sa mearga

Link spre comentariu
Acum 19 ore, deejay2k1 a spus:

//+5V - LDR, AnalogPin - resistor - GND
// LdrDarkResistance = 500 kOhm
// LdrLightResistance = 10kOhm
// resistorValue = 47kOhm
#define LDRpin A0 // ajusteaza dupa schema

  // periodic ....
const int darkLdrVoltage = 87; //429mV ~ 87, ajusteaza dupa caz (divizor resitiv)
const int brightLdrVoltage = 843; // 4.123V ~ 843, ajusteaza dupa caz
int intensityValue = map(analogRead(LDRpin), darkLdrVoltage,brightLdrVoltage,0x01,0x0f);
intensityValue = constrain(intensityValue,0x01,0x0f);
mx.control(MD_MAX72XX::INTENSITY, intensityValue);

apeleaza bucata de dupa //periodic .... periodic. Ar trebui sa mearga

Nu functioneaza, eu NU folosesc libraria MC_MAX72XX , ci libraria LedControl.h

Eroare : 'MD_MAX72XX' has not been declared'

Partea de inceput a codului folosit de mine:

[code]
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 12 on the Arduino
#define piDS 12
#define precizie 12

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(piDS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature senzori(&oneWire);

// arrays to hold device addresses
DeviceAddress senzor1, senzor2, senzor3;

// temperaturi senzori
float t1, t2, t3 ;

#include <avr/pgmspace.h>
#include <LedControl.h>

const int numDevices = 4;      // number of MAX7219s used
const long scrollDelay = 17;   // adjust scrolling speed
unsigned long bufferLong [14] = {0};
LedControl lc = LedControl(11, 13, 10, numDevices);

#include <Wire.h>
#include "RTClib.h" // from https://github.com/adafruit/RTClib
RTC_DS1307 RTC; // Tells the RTC library that we're using a DS1307 RTC

[/code]

 

Link spre comentariu
Acum 3 minute, valentin marcarian a spus:

Salut.
Ma bag si eu in seama. 
Inlocuieste linia asta : 
mx.control(MD_MAX72XX::INTENSITY, intensityValue);

cu :
lc.setIntensity(0,intensityValue);
Bafta.

Mersi, da acum merge.

Link spre comentariu
  • 2 săptămâni mai târziu...

Revin si eu din nou cu o rugaminte la cei care se pricep.

 

Am realizat acest ceas-data-termo cu afisaj 8x32 Matrix folosind un Arduino Nano, merge aproape asa cum imi doresc (mai vreau sa includ si afisare zilei, ceva gen: Luni, Marti, etc).

Acum vreau ca sa realizez acest montaj FARA sa mai folosesc modulul Arduino, adica sa folosesc doar HEX-ul generat de Arduino pe care sa-l incarc intr-un Atmega328p (nou, fara bootloader), problema este ca nu stiu setarile la fuse bits si ce altceva mai trebuie pentru a realiza acest lucru.

Nu as vrea ca sa scriu si bootloaderul in noul Atmega328p, sa scriu simplu-direct HEX-ul, setez Fuse Bitii si la punerea lui Atmega328p programat pe cablajul montajului sa functioneze ok ca si cu modulul Arduino.

 

Multumesc anticipat pentru ajutor.

Link spre comentariu

Salut.

Fuse bitii sunt:

low_fuses=0xFF
high_fuses=0xD9
extended_fuses=0xFF

Hex-ul rezultat dupa compilare o sa-l gasesti in calea asta, daca ai win7 sau win10:

C:\Users\nume user\AppData\Local\Temp\arduino_build_xxx\
 

Daca gresesc va rog sa ma corectati,

Spor.

 

Editare ulterioara: Fuse-bitii pentru un cuartz mai mare de 8Mhz Sunt obosit tare, scuze am gresit si fuse bitii. Sper sa nu fi gresit iarasi. Ar fi bine si o alta confirmare.

Editat de valentin marcarian
Link spre comentariu
Acum 21 ore, valentin marcarian a spus:

Salut.

Fuse bitii sunt:

low_fuses=0xFF
high_fuses=0xD9
extended_fuses=0xFF

Hex-ul rezultat dupa compilare o sa-l gasesti in calea asta, daca ai win7 sau win10:

C:\Users\nume user\AppData\Local\Temp\arduino_build_xxx\
 

Daca gresesc va rog sa ma corectati,

Spor.

 

Editare ulterioara: Fuse-bitii pentru un cuartz mai mare de 8Mhz Sunt obosit tare, scuze am gresit si fuse bitii. Sper sa nu fi gresit iarasi. Ar fi bine si o alta confirmare.

 

Acum 19 ore, nico_2010 a spus:

in ordinea scrisa de user:

fuse:w:0xcf:m-U hfuse:w:0xd9:m-U efuse:w:0xfd:

 

Deci pana la urma sa inteleg corect nico:

Low fuse:  0xCF   -  nu 0xFF cum a scris valentin

High fuse 0xD9    - la fel cum a scris valentin

Extended fuse 0xFD - nu 0xFF cum a scris valentin

 

Am sa desenez schema si revin cu detalii-intrebari.

Multumesc.

Link spre comentariu
La 30.03.2018 la 21:19, nico_2010 a spus:

Corect. Ai intelels bine. Pentru verificare: http://www.engbedded.com/fusecalc/

 

OK, mersi pentru link, am lucrat putin cu acesl Fusecalculator acum ceva timp.

 

Fuse Bits-ii indicati mai sus sunt valabili intotdeauna la un sketch din Arduino? 

 

Momentan am schitat o schema pentru realizarea ceasului fara modulul Arduino.

Studiez acum metoda de afisare a zilei (Luni, Marti, etc) precum si "incercarea" de introducere a 3 butoane pentru a putea regla ora, data, ziua din ele, momentan nu exista posibilitatea decat prin conectarea modulului Arduino la PC si re-incarcarea sketch-ului ca sa "ia" ora curenta a PC-ului.

Sunt ceva batai de cap, sper sa reusesc, daca nu revin cu intrebari in topic.

 

Ceas-_Data-_Termo_cu_Atmega328p_si_Dot_M

Link spre comentariu

Salut,

Da, fusebits - asa cum i-am scris  - sunt valabili pentru orice sketch Arduino si au urmatoarea semnificatie:

LOW : 0XCF - low power oscillator (nu ai nevoie de semnal de clock pe pinul XTAL2), intarziere de 1000 pulsuri de ceas pentru pornire + intarziere de 4.1ms (watchdog);

HIGH: 0XD9 - Serial Program Downloading (SPI) enabled, Divide by 8 disabled, Boot Flash 2048 words default value;

EXT: 0XFD - Brownout enabled, nivel de actionare 2.7V.

Cat priveste "citirea" si "scrierea" zilelor saptamanii poti folosi varianta scrierii lor in Flash, ceva de genul:

 

const char *Days[] PROGMEM = {"Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata"};

Si pentru inspiratie privind implementarea butoanelor, incearca asta:

http://6502cpu.blogspot.ro/2013/01/arduino-uno-and-ds1307-real-time-clock.html

Link spre comentariu
  • 8 luni mai târziu...

Revin iar in acest topic, ca sa nu mai deschid altul.

 

Citesc o temperatura de la un senzor DS18b20, o afisez pe 4 digiti led multiplexati, totul decurge normal la temperaturi pozitive.

 

Intrebarea mea este, cum fac sa citesc-afisez si temperaturi negative pe acesti digiti?

 

Bucata de cod care citeste-afiseaza temperatura:

 

 //citire senzor DS

  sensors.requestTemperatures(); 
  float temp1 = sensors.getTempC(sensors1); 
  int t1 = (int) temp1;


//Afisare pe digiti multiplexati

  data[0] = (t1 / 10);                  
  data[1] = (t1 % 10);                  
  data[2] = 10;                        // simbol grad
  data[3] = 11;                        // litera C ptr Celsius

 

 

 Am incercat introducerea partii de citire de la afisarea temperaturii de la Ceasul-Termometrul cu dotMatrix postat ceva posturi mai sus:

 



 sensors.requestTemperatures();  //Request temperature from the sensor.
  float temp2 = sensors.getTempC(sensors2);  //Read temperature from the first (only) sensor on the bus.
  int t2 = (int) temp2; //Convert the temperature to int for display

  t2 = -15;          // am pus -15 grade ca vad cum afiseaza

  int t2a = 10 * t2;
  int tz2 = t2a / 100;
  t2a = t2a - tz2 * 100;
  int tu2 = t2a / 10;
  int ts2 = t2a % 10;

 if (t2 > 0.0f)
  {
    data[0] = (tz2);                  
    data[1] = (tu2);                  
    data[2] = 10;                // semn grad        
    data[3] = 11;                // litera C ptr Celsius       

  }

  else
  {
    data[0] = 20;                  // semn -
    data[1] = (tz2);                 
    data[2] = (tu2);                        
    data[3] = 10;                  // semn grad
  }

 

 

Nu imi afiseaza corect temperatura negativa, imi afiseaza -88  (eu am scris temp de -15).  La temperatura pozitiva arata bine.

 

Multumesc anticipat pentru ajutor.

Editat de GeoMar
Link spre comentariu

Vezi in datasheet. DS1B20 da temperaturile negative diferit de cele pozitive si trebuie facute un pic de calcule pentru temperaturile negative. Daca la citire, bitii 15...11 sunt 1, inseamna ca temperatura e negativa si atunci din 10000h trebuie sa scazi valoarea citita si obtii temperatura corecta. Sau, ca sa nu folosesti o scadere pe 3 octeti, scazi din FFFFh  valoarea citita si apoi adaugi 1. In asm e simplu de facut, dar in C trebuie sa cauti o biblioteca care sa stie sa faca asta. Posibil ca biblioteca care o folosesti ia in considerare numai bitul 15 pentru temperaturi negative.

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