Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <Wire.h>
- #define BME280_ADDRESS (0x77) // Adresa I2C a senzorului
- #define BME280_REGISTER_CHIPID (0xD0) // Adresa registrului ChipID
- #define BME280_REGISTER_CONTROLHUMID (0xF2) // Adresa registrului de configurare, umiditate
- #define BME280_REGISTER_CONTROL (0xF4) // Adresa registrului de configurare, masuratori
- #define BME280_REGISTER_TEMPDATA (0xFA) // Adresa registrului de date, temperatura
- int plus,minus;
- typedef struct
- {
- uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3;
- uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5;
- int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9;
- uint8_t dig_H1; int16_t dig_H2; uint8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6;
- } bme280_calib_data;
- // Factori de calibrare. In mod normal acestia se citesc din memoria ROM a senzorului
- bme280_calib_data _bme280_calib = {28398, 26500, 50, 36953, -10772, 3024, 7550, 6, -7, 9900, -10230,
- 4285, 75, 368, 0, 302, 0, 30};
- int32_t t_fine;
- // Functia de compensare din Datasheet, de la pag. 23
- // https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf
- float compensateTemperature(int32_t adc_T)
- {
- int32_t var1, var2;
- adc_T >>= 4;
- var1 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) *
- ((int32_t)_bme280_calib.dig_T2)) >> 11;
- var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) *
- ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) *
- ((int32_t)_bme280_calib.dig_T3)) >> 14;
- t_fine = var1 + var2;
- float T = (t_fine * 5 + 128) >> 8;
- return T/100;
- }
- LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
- //se creaza o valoare intermediara in asa fel incat
- //sa stergem ecranul LCD ului doar cand valoarea se modifica
- int valIntermediar;
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- Serial.println("BME280 test");
- delay(500);
- // Exemplu citire registru
- // Citim CHIPID
- Wire.beginTransmission((uint8_t)BME280_ADDRESS);
- Wire.write((uint8_t)BME280_REGISTER_CHIPID);
- Wire.endTransmission();
- Wire.requestFrom((uint8_t)BME280_ADDRESS, (byte)1);
- uint8_t value = Wire.read();
- Serial.print("Registru Chip_Id (0xD0): ");
- Serial.println(value);
- // Exemplu scriere registru
- // Setam umiditatea la 16x oversampling
- Wire.beginTransmission((uint8_t)BME280_ADDRESS);
- Wire.write((uint8_t)BME280_REGISTER_CONTROLHUMID);
- Wire.write((uint8_t)0x05);
- Wire.endTransmission();
- // Setam Temperatura si Presiunea la 16x oversampling + Normal mode (Not sleep)
- Wire.beginTransmission((uint8_t)BME280_ADDRESS);
- Wire.write((uint8_t)BME280_REGISTER_CONTROL);
- Wire.write((uint8_t)0xB7);
- Wire.endTransmission();
- //parte 1 end
- //setam tensiunea de referinta la 5V
- analogReference(DEFAULT); //setarea tensiunii de referinta la tensiunea default
- lcd.begin(16, 2); //initializarea LCD ului
- lcd.setCursor(0,0);
- lcd.print("Cititi senzor");
- pinMode(A1, INPUT); // setarea pinului analogic A1 ca si pin de input
- digitalWrite(A1, HIGH); //activarea rezistorului pull up pentru pinul A1
- //initializam valoarea intermediara la o valoare foarte mare
- valIntermediar = 1000;
- }
- void loop()
- {
- Wire.beginTransmission((uint8_t)BME280_ADDRESS);
- Wire.write((uint8_t)BME280_REGISTER_TEMPDATA);
- Wire.endTransmission();
- // Temperatura raw este in registrii 0xFA, 0xFB, 0xFC.
- // Putem citii registrii consecutiv, si adresa se auto incrementeaza
- Wire.requestFrom((uint8_t)BME280_ADDRESS, (byte)3);
- uint32_t raw_temperature;
- raw_temperature = Wire.read();
- raw_temperature <<= 8;
- raw_temperature |= Wire.read();
- raw_temperature <<= 8;
- raw_temperature |= Wire.read();
- // Temperatura raw e pe 20 de biti
- Serial.print("Temperatura raw: ");
- Serial.println(raw_temperature >> 4);
- int val = analogRead(A1); //citirea valorii analogice
- //luam tasta aferenta tensiunii analogice
- val = getTasta(val);
- valIntermediar = compensateTemperature(raw_temperature);
- if(val == 1) plus ++;
- if(val == 2) minus ++;
- if(valIntermediar != val)
- {
- //setam ca noua valoare intermediara sa fie egala cu val
- lcd.clear();//curatam ecranul
- lcd.setCursor(0,0);
- lcd.print("Cititi senzor");
- lcd.setCursor(0,1);//si afisam noua valoare
- lcd.print(valIntermediar + plus - minus);
- }
- }
- /*
- in aceasta functie se paseaza ca si parametru o valoare analogica
- si se returneaza o tasta corespunzatoare acelei valori
- Din cauza faptului ca semnalul analogic nu este filtrat si stabilizat acesta
- fluctueaza in continuu.
- Pentru a prinde doar acele valori care ne intereseaza se face o histereza
- Intervalele au fost alese experimental, bineinteles bazandu-ne si pe tensiunile din
- data
- sheet.
- */
- int getTasta(int val)
- {
- if(val > 50 && val < 80)return 12;//e apasata tasta 12
- else if(val > 90 && val < 120) return 11; //e apasata tasta 11
- else if(val > 120 && val < 160) return 10; // si asa mai departe…
- else if(val > 160 && val < 200) return 9;
- else if(val > 200 && val < 240)return 8;
- else if(val > 240 && val < 290) return 7;
- else if(val > 290 && val < 320) return 6;
- else if(val > 320 && val < 370) return 5;
- else if(val > 370 && val < 410) return 4;
- else if(val > 410 && val < 450) return 3;
- else if(val > 450 && val < 490) return 2;
- else if(val > 490 && val < 530) return 1;
- else return 0; //pentru orice alta valoare returnam 0 – tasta neapasata
- }
Advertisement
Add Comment
Please, Sign In to add comment