Bogdan's Docs

Table of Contents

Table of Contents

  • Senzori
    • Fotorezistor
    • Microfon
    • Temperatură și Umiditate
    • Presiune Atmosferică
    • Accelerometru
    • Citirea Avansată a Senzorilor

Ideas

  • Artificial Intelligence
    • Bond Pricing
    • Kubernetes Inference
    • Knowledge Bot
    • Ready to Use Models
    • Satellite Damage Detection

Curs IoT si AI (ro) Resources

  • Links
    • Artificial Intelligence
  • Recipes
    • MacOS
Bogdan's Docs
Docs » iot-si-ai:senzori

Senzori

Fotorezistor

Senzorul de lumină Grove conține un fotorezistor care poate fi folosit pentru a detecta intensitatea luminoasă. Rezistența fotorezistorului scade odată cu creșterea intensității luminoase. Un amplificator operațional dual LM358 convertește variația rezistenței în variația tensiunii. Valoarea semnalului de ieșire este continuă, cu cât intensitatea luminoasă e mai mare cu atât tensiunea va fi mai mare.

Modulul poate fi utilizat pentru a construi diferite aplicații care să depindă de intensitatea luminoasă: spre exemplu, aprinderea unor lumini de veghe:

// Întrerupător luminos
int sensorPin = A6; // Pinul la care senzorul este conectat
int ledPin = 4; // Pinul la care LED-ul este conectat
int sensorValue = 0; // Valoarea senzorului (intrarea analogică)
 
void setup()
{
    pinMode(ledPin, OUTPUT);
    pinMode(sensorPin, INPUT);
    Serial.begin(9600);
}
 
void loop()
{
    sensorValue = analogRead(sensorPin); // Citește valoarea senzorului
 
    Serial.println(sensorValue); // Trimite către calculator valoarea senzorului
 
    if (sensorValue < 200)
    { // Aprinde LED-ul când e întuneric
        digitalWrite(ledPin, HIGH);
    }
    else
    { // Stinge LED-ul când e lumină
        digitalWrite(ledPin, LOW);
    }
    delay(200);
}

Microfon

// Lumină controlată de sunet
int soundPin = A2; // Analog sound sensor is to be attached to analog
int ledPin = 4; // Digital LED is to be attached to digital
 
void setup()
{
    pinMode(ledPin, OUTPUT);
    pinMode(soundPin, INPUT);
    Serial.begin(9600);
}
 
void loop()
{
    int soundState = analogRead(soundPin); // Citește valoarea intensității sonore
    Serial.println(soundState); // Trimite către calculator valoarea intensității
 
    if (soundState > 400)
    { // Dacă sunetul e puternic, aprinde LED-ul
        digitalWrite(ledPin, HIGH);
        delay(100);
    }
    else
    { // În lipsa zgomotului, stinge LED-ul
        digitalWrite(ledPin, LOW);
    }
}

Temperatură și Umiditate

Senzorul de temperatură și umiditate din modulul Grove este DHT11. DHT11 este un senzor de umiditate și temperatură digital, utilizat în proiecte de electronică și automatizări. Senzorul are o precizie moderată și este capabil să măsoare temperatura în intervalul de 0-50 grade Celsius, cu o precizie de 2 grade Celsius, și umiditatea relativă a aerului în intervalul de 20-90%, cu o precizie de 5%. DHT11 folosește un protocol de comunicare digital și este disponibil într-o variantă care include și un rezistor de pull-up integrat, făcându-l ușor de utilizat în proiecte cu microcontrolere cum ar fi Arduino.

Biblioteca software pentru a putea accesa senzorul prin intermediul Arduino se găsește aici.

// Termometru digital
#include "DHT.h"
#include <Arduino.h>
#include <U8x8lib.h>
 
#define DHTPIN 3 // pinul Arduino la care este conectat senzorul
#define DHTTYPE DHT20 // tipul senzorului, în cazul acesta DHT11
DHT dht(DHTTYPE);
 
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE);
 
void setup(void)
{
    Serial.begin(9600);
    Serial.println("Termometru Digital");
    Wire.begin();
    dht.begin();
    u8x8.begin();
    u8x8.setPowerSave(0);
    u8x8.setFlipMode(1);
}
 
void loop(void)
{
    float temp, humi;
    temp = dht.readTemperature();
    humi = dht.readHumidity();
 
    u8x8.setFont(u8x8_font_chroma48medium8_r);
    u8x8.setCursor(0, 33);
    u8x8.print("Temp:");
    u8x8.print(temp);
    u8x8.print("C");
    u8x8.setCursor(0, 50);
    u8x8.print("Umid:");
    u8x8.print(humi);
    u8x8.print("%");
    u8x8.refreshDisplay();
    delay(200);
}

Presiune Atmosferică

Senzorul folosit pentru determinarea presiunii atmosferice este BMP280. BMP280 este un senzor de presiune atmosferică și temperatură, dezvoltat de Bosch Sensortec. Acesta este folosit într-o gamă largă de aplicații, inclusiv în industria aerospațială, domeniul medical și în dispozitive de monitorizare a vremii. Senzorul BMP280 este capabil să măsoare temperatura și presiunea atmosferică cu o precizie ridicată. Are o interfață digitală I2C sau SPI și poate funcționa cu o tensiune de alimentare între 1,8V și 5V. BMP280 este un senzor foarte popular în comunitatea Arduino și este utilizat în proiecte precum stații meteorologice, drone, roboți și multe altele.

Biblioteca software pentru utilizarea senzorului prin intermediul Arduino se găsește aici.

//Air pressure detection
#include "Seeed_BMP280.h"
#include <Wire.h>
 
BMP280 bmp280;
 
void setup()
{
    Serial.begin(9600);
    if (!bmp280.init())
    {
        Serial.println("Device not connected or broken!");
    }
}
 
void loop()
{
    float pressure;
 
    // get and print temperatures
    Serial.print("Temp: ");
    Serial.print(bmp280.getTemperature());
    Serial.println("C"); // The unit for  Celsius because original arduino don't support speical symbols
 
    // get and print atmospheric pressure data
    Serial.print("Pressure: ");
    Serial.print(pressure = bmp280.getPressure());
    Serial.println("Pa");
 
    // get and print altitude data
    Serial.print("Altitude: ");
    Serial.print(bmp280.calcAltitude(pressure));
    Serial.println("m");
    Serial.println("\n"); // add a line between output of different times.
    delay(1000);
}

Accelerometru

Accelerometru digital cu 3 axe este un accelerometru cu 3 axe, inclus în gama de produse Grove. Este bazat pe cipul LIS3DHTR, care oferă selecție multiplă de interfețe și intervale de măsurare. LIS3DHTR este un accelerometru digital 3-axial, un senzor care măsoară accelerația (schimbarea vitezei) în cele trei axe de mișcare. Acest senzor se bazează pe cipul LIS3DHTR și este utilizat într-o varietate de aplicații care necesită măsurarea mișcării sau a schimbării accelerației, cum ar fi în aplicații de monitorizare a sănătății sau de control al mișcării în jocurile video. Senzorul LIS3DHTR poate fi conectat la un microcontroller sau la alte dispozitive electronice prin intermediul interfeței I2C, SPI sau ADC GPIO, iar în acest fel poate fi integrat cu ușurință într-un proiect Arduino utilizând un modul Grove - 3-Axis Digital Accelerometer (LIS3DHTR) Grove. În plus, acest accelerometru poate monitoriza temperatura din jur pentru a ajusta eroarea cauzată de aceasta.

Click aici pentru a descărca biblioteca software pentru interfațarea I2C cu LIS3DHTR.

// Măsurarea accelerației gravitaționale
#include "LIS3DHTR.h"
#ifdef SOFTWAREWIRE
    #include <SoftwareWire.h>
    SoftwareWire myWire(3, 2);
    LIS3DHTR<SoftwareWire> LIS; // Configurează I2C în software
    #define WIRE myWire
#else
    #include <Wire.h>
    LIS3DHTR<TwoWire> LIS; // Configurează I2C în hardware
    #define WIRE Wire
#endif
 
void setup()
{
    Serial.begin(9600);
    while (!Serial)
    {
    };
    LIS.begin(WIRE, 0x19); // Inițializează conexiunea I2C
    delay(100);
    LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ);
}
void loop()
{
    if (!LIS)
    {
        Serial.println("LIS3DHTR nu s-a conectat.");
        while (1)
            ;
        return;
    }
    // 3 axis
    Serial.print("x:");
    Serial.print(LIS.getAccelerationX());
    Serial.print("  ");
    Serial.print("y:");
    Serial.print(LIS.getAccelerationY());
    Serial.print("  ");
    Serial.print("z:");
    Serial.println(LIS.getAccelerationZ());
 
    delay(500);
}

Citirea Avansată a Senzorilor

Acest program este creat pentru a citi date de la diferiti senzori si a le transmite prin intermediul unei interfete seriale la un computer. Senzorii utilizati sunt un senzor de umiditate si temperatura DHT20, un senzor de presiune BMP280, un accelerometru LIS3DHTR, un senzor de lumina si unul de sunet. In setup(), se initializeaza senzorii, se seteaza pinii si se incepe comunicarea prin interfata seriala. In loop(), se citesc datele de la senzori si se trimit prin interfata seriala, doar daca se primeste caracterul r de la computer. Datele sunt trimise in format CSV, folosind virgula ca separator si cu patru zecimale. Varianta imbunatatita, care permite comenzi mai complexe, poate fi consultata aici.

CSV (Comma Separated Values) este un format de fișier text utilizat pentru a stoca date structurate, în care datele sunt separate prin virgule sau alte delimitatoare, cum ar fi tabulatorul sau punctul și virgula. Fiecare linie din fișier reprezintă un înregistrare și fiecare câmp dintr-un înregistrare este separat prin delimitatorul specificat.

Acest format este popular din mai multe motive:

  • Este ușor de utilizat și de înțeles atât de oameni, cât și de programe
  • Poate fi deschis și editat într-un editor de text obișnuit sau într-un program de foi de calcul
  • Este un format comun pentru import și export de date între aplicații software diferite
  • Poate fi utilizat pentru a stoca date într-un mod compact și eficient, ocupând mai puțin spațiu decât alte formate, cum ar fi XML sau JSON.
  • Este suportat de majoritatea limbajelor de programare și bazelor de date

De exemplu, fișierele CSV sunt folosite frecvent în domenii cum ar fi finanțele, marketingul, vânzările sau statisticile pentru a analiza și a importa/exporta date.

#include "DHT.h" // biblioteca pentru senzorul de umiditate și temperatură
#include "Seeed_BMP280.h" // biblioteca pentru senzorul de presiune
#include <Wire.h> // biblioteca prin protocolul I2C
#include "LIS3DHTR.h" // biblioteca pentru accelerometru
#include <U8x8lib.h> // biblioteca pentru ecranul OLED
 
#define DHTTYPE DHT20 // tipul senzorului de umiditate și temperatură, în cazul nostru DHT20
 
int lightPin = A6; // pinul la care senzorul de lumină este conectat
int soundPin = A2; // pinul la care senzorul de sunet este conectat
int ledPin = 4; // pinul la care ledul este conectat
 
DHT dht(DHTTYPE); // initializare senzor de umiditate și temperatură
BMP280 bmp280; // initializare senzor de presiune
LIS3DHTR<TwoWire> LIS; // initializare accelerometru
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(U8X8_PIN_NONE); // initializare ecran OLED
 
void setup()
{
    pinMode(ledPin, OUTPUT); // setează pinul ledului ca pin de ieșire
    Wire.begin(); // pornire protocol I2C
    dht.begin(); // pornire senzor de umiditate și temperatură
    bmp280.init(); // pornire senzor de presiune
    LIS.begin(Wire, 0x19);  // pornire accelerometru
    delay(100); // așteaptă 100ms
    LIS.setOutputDataRate(LIS3DHTR_DATARATE_50HZ); // seteaza rata de esantionare a accelerometrului la 50Hz
    u8x8.begin(); // pornire ecran OLED
    u8x8.setPowerSave(0); // dezactivează modul de economisire a energiei
    u8x8.setFlipMode(1); // rotește ecranul
    u8x8.setFont(u8x8_font_chroma48medium8_r); // setează fontul
    Serial.begin(9600); // pornire interfață serială
}
 
/**
 * Pentru a citi datele de la senzori, vom folosi formatul CSV (comma separated values), adică datele vor fi separate prin virgulă.
 * Vom citi datele de la senzori și le vom trimite prin interfața serială către PC numai dacă primim un caracter 'r' de la PC.
*/
 
void loop()
{
    // pentru ca vrem o comunicare sincronă între Arduino și PC, vom trimite datele doar dacă primim un caracter 'r' de la PC
    if (Serial.available() > 0 && Serial.read() == 'r') {
        float lightValue = ((float) analogRead(lightPin)) / 1023.0; // citește valoarea senzorului de lumină și o transformă într-un număr între 0 și 1
        float soundValue = ((float) analogRead(soundPin)) / 1023.0; // citește valoarea senzorului de sunet și o transformă într-un număr între 0 și 1
        float dhtTempValue = dht.readTemperature(); // citește valoarea temperaturii din senzorul de umiditate și temperatură
        float dhtHumiValue = dht.readHumidity(); // citește valoarea umidității din senzorul de umiditate și temperatură
        float bmpTempValue = bmp280.getTemperature(); // citește valoarea temperaturii din senzorul de presiune
        float bmpPresValue = bmp280.getPressure(); // citește valoarea presiunii din senzorul de presiune
        float bmpAltitudeValue = bmp280.calcAltitude(bmpPresValue); // calculează valoarea altitudinii din valoarea presiunii
        float accX = LIS.getAccelerationX(); // citește valoarea acceleratiei pe axa X
        float accY = LIS.getAccelerationY(); // citește valoarea acceleratiei pe axa Y
        float accZ = LIS.getAccelerationZ(); // citește valoarea acceleratiei pe axa Z
 
        digitalWrite(ledPin, HIGH); // aprinde ledul
        // trimite datele prin interfața serială în format CSV, folosind virgula ca separator si 4 zecimale
        Serial.print(lightValue, 4); Serial.print(","); // trimite valoarea senzorului de lumină prin interfața serială
        Serial.print(soundValue, 4); Serial.print(","); // trimite valoarea senzorului de sunet prin interfața serială
        Serial.print(dhtTempValue, 4); Serial.print(","); // trimite valoarea temperaturii prin interfața serială
        Serial.print(dhtHumiValue, 4); Serial.print(","); // trimite valoarea umidității prin interfața serială
        Serial.print(bmpTempValue, 4); Serial.print(","); // trimite valoarea temperaturii prin interfața serială
        Serial.print(bmpPresValue, 4); Serial.print(","); // trimite valoarea presiunii prin interfața serială
        Serial.print(bmpAltitudeValue, 4); Serial.print(","); // trimite valoarea altitudinii prin interfața serială
        Serial.print(accX, 4); Serial.print(","); // trimite valoarea acceleratiei pe axa X prin interfața serială
        Serial.print(accY, 4); Serial.print(","); // trimite valoarea acceleratiei pe axa Y prin interfața serială
        Serial.println(accZ, 4); // trimite valoarea acceleratiei pe axa Z prin interfața serială
        digitalWrite(ledPin, LOW);
 
        // afișează datele pe ecranul OLED
        u8x8.setCursor(0, 1);
        u8x8.print("TMP_1:"); u8x8.print(dhtTempValue); u8x8.print("C");
        u8x8.setCursor(0, 10);
        u8x8.print("HUMID:"); u8x8.print(dhtHumiValue); u8x8.print("%");
        u8x8.setCursor(0, 19);
        u8x8.print("TMP_2:"); u8x8.print(bmpTempValue); u8x8.print("C");
        u8x8.setCursor(0, 28);
        u8x8.print("PRESS:"); u8x8.print(bmpPresValue / 1000.0); u8x8.print("kPa");
        u8x8.setCursor(0, 37);
        u8x8.print("LIGHT:"); u8x8.print(lightValue);
        u8x8.setCursor(0, 46);
        u8x8.print("SOUND:"); u8x8.print(soundValue);
        u8x8.setCursor(0, 55);
        u8x8.print(accX, 1); u8x8.print(" "); u8x8.print(accY, 1); u8x8.print(" "); u8x8.print(accZ, 1); u8x8.print(" ");
        u8x8.refreshDisplay(); // actualizează ecranul OLED
    }
}
Previous Next