GeoMar Postat Martie 19, 2018 Autor Partajează Postat Martie 19, 2018 (editat) 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. 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: 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 Martie 19, 2018 de GeoMar Link spre comentariu
deejay2k1 Postat Martie 19, 2018 Partajează Postat Martie 19, 2018 //+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
GeoMar Postat Martie 19, 2018 Autor Partajează Postat Martie 19, 2018 Multumesc pentru exemplu. Maine seara dupa servici implementez in cod si revin cu detalii-functionare. Link spre comentariu
GeoMar Postat Martie 20, 2018 Autor Partajează Postat Martie 20, 2018 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
MVS Postat Martie 20, 2018 Partajează Postat Martie 20, 2018 Salut. Ma bag si eu in seama. Inlocuieste linia asta : mx.control(MD_MAX72XX::INTENSITY, intensityValue); cu : lc.setIntensity(0,intensityValue); Bafta. Link spre comentariu
GeoMar Postat Martie 20, 2018 Autor Partajează Postat Martie 20, 2018 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
GeoMar Postat Martie 29, 2018 Autor Partajează Postat Martie 29, 2018 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
MVS Postat Martie 29, 2018 Partajează Postat Martie 29, 2018 (editat) 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 Martie 29, 2018 de valentin marcarian Link spre comentariu
nico_2010 Postat Martie 29, 2018 Partajează Postat Martie 29, 2018 in ordinea scrisa de user: fuse:w:0xcf:m-U hfuse:w:0xd9:m-U efuse:w:0xfd: Link spre comentariu
GeoMar Postat Martie 30, 2018 Autor Partajează Postat Martie 30, 2018 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
nico_2010 Postat Martie 30, 2018 Partajează Postat Martie 30, 2018 Corect. Ai intelels bine. Pentru verificare: http://www.engbedded.com/fusecalc/ Link spre comentariu
GeoMar Postat Aprilie 1, 2018 Autor Partajează Postat Aprilie 1, 2018 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. Link spre comentariu
nico_2010 Postat Aprilie 2, 2018 Partajează Postat Aprilie 2, 2018 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
GeoMar Postat Decembrie 20, 2018 Autor Partajează Postat Decembrie 20, 2018 (editat) 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 Decembrie 20, 2018 de GeoMar Link spre comentariu
cimitavita Postat Decembrie 21, 2018 Partajează Postat Decembrie 21, 2018 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum