You are on page 1of 7

MINISTERUL EDUCAŢIEI, CULTURII ȘI CERCETĂRII

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatică şi Microelectronică
Departamentul Ingineria Software și Automatică

Raport
Lucrare de laborator nr. 3
Disciplina: Internetul Lucrurilor(IoT)
Tema: Achizitie de informații. Senzori.

Student: _____________ Mereuță Ana, TI-192

Coordonator: _____________ Lupan Cristian, asist. univ.

Chişinău 2022
Scopul lucrării:
Sa se realizeze o aplicație in baza de MCU care va prelua un semnal de la o sursa de semnal, va
condiționa semnalul, si va afișa parametrul fizic la un terminal (LCD si/sau Serial). Fiecare student va
selecta un senzor fie analogic fie digital (nu binar) din PDF atașat sau: http://www.37sensors.com/
- Sa se achiziționeze semnalul de la senzor;
- Să se condiționeze semnalul implicând filtre digitale și alte metode;
- Să se afișeze datele pe afișor LCD și / sau Serial.
Indicații teoretice
Arduino constă atât într-o placă de circuite programabile fizic ( microcontroler), cât și într-o parte de
software sau pe scurt IDE (Integrated Development Environment) care rulează pe computerul dvs. Acesta
este folosit pentru scrie și încărca codul computerului pe un board fizic.
Placa de dezvoltare Arduino poate interacționa și funcționa cu butoane, LED-uri, motoare, difuzoare,
unități GPS, camere video, internet și chiar poate conlucra cu un smartphone sau un televizor. Această
flexibilitate combinată cu faptul că software-ul Arduino este gratuit, plăcile hardware sunt destul de ieftine,
iar ambele, atât software-ul cât și hardware-ul sunt ușor de învățat și folosit.
MCU este utilizat într-o gamă largă de aplicații, inclusiv mașini de spălat, roboți, drone, radio și controlere
de jocuri. Istoria MCU poate fi urmărită până la invenția tehnologiei MOSFET. În primele zile, MCU era
un circuit integrat semiconductor primitiv cu o unitate de procesor și un modul de memorie.

Figura 1 – Transformarea temperaturii de la sensor afișând pe LCD


Listing-ul senzorului de temperature:

#include <Adafruit_LiquidCrystal.h>

#define sensor A0

Adafruit_LiquidCrystal lcd(0);

void sw(float a[]){


for (int i = 0; i < 5; i++){
a[i] = a[i+1];
}
}

void disp(float t1, float t2){


lcd.setCursor(10, 0);
lcd.print(t1);
lcd.setCursor(10, 1);
lcd.print(t2);
}

float getTemperature(){
float voltage = (analogRead(sensor) * (1.75 / 358.0));
float temperature = ((voltage*1000) - 500) /10;

Serial.print("Real time temperature = "); Serial.println(temperature);


return temperature;
}

float weighted_median(float temps[]){ // aici calculam media aritmetica ponderata


int weight = 2;
float temperature = ((weight*temps[0] + weight*temps[1] +
weight*temps[2] + weight*temps[3] +
weight*temps[4])/(weight*5));

return temperature;
}

void swap(float *p,float *q) {


float t;

t=*p;
*p=*q;
*q=t;
}

float salt_and_pepper(float temps[]){ // functia pentru filtru sare si piper


int i,j,n = 5; float a[5];

for (i = 0; i < 5; i++){


a[i] = temps[i] ;
}

for(i = 0;i < n-1;i++){ // sortarea array-ului


for(j = 0;j < n-i-1;j++) {
if(a[j] > a[j+1])
swap(&a[j],&a[j+1]);
}
}
int med_n = (n+1) / 2 - 1; // aici se alege valoare din mijloc
float temperature = a[med_n];
return temperature;
}

void setup()
{
pinMode(sensor, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Median = " );
lcd.setCursor(0, 1);
lcd.print("Spices = " );
}

int i = 0;
void loop()
{

float temps[5];
Serial.println("MEASURING...");
if (i < 4){
temps[i] = getTemperature();
}
if (i >= 4){
sw(temps);
temps[4] = getTemperature();
}
float temp1 = weighted_median(temps);
float temp2 = salt_and_pepper(temps);
disp(temp1, temp2);
delay(2000);

i++;
}
Figura 2 – Transformarea umidității în MA și SS de la senzorul umidității pe LCD

Figura 3 – Afizarea celor 3 valori pentru calcul MA și SS

Listing-ul senzorului de umiditate:

#include <Adafruit_LiquidCrystal.h>

#define sensor A0

Adafruit_LiquidCrystal lcd(0);

void sw(float a[]){


for (int i = 0; i < 5; i++){
a[i] = a[i+1];
}
}

void disp(float t1, float t2){


lcd.setCursor(10, 0);
lcd.print(t1);
lcd.setCursor(10, 1);
lcd.print(t2);
}

float getMoisture(){
float voltage = (analogRead(sensor) * (5.0 / 1023.0));
int moisture = map(voltage*100, 0, 428, 0, 100);
Serial.print("Real time moisture = "); Serial.println(moisture);
return moisture;
}

float weighted_median(float moists[]){


int weight = 2;
float moisture = ((weight*moists[0] + weight*moists[1] +
weight*moists[2] + weight*moists[3] +
weight*moists[4])/(weight*5));
return moisture;
}

void swap(float *p,float *q) { //funcția swap pentru spice


float t;

t=*p;
*p=*q;
*q=t;
}

float salt_and_pepper(float moists[]){


int i,j,n = 5; float a[5]; // se iau valorile și le aranjăm într-un array
//transfer to current
for (i = 0; i < 5; i++){
a[i] = moists[i] ;
}
//sorting
for(i = 0;i < n-1;i++){
for(j = 0;j < n-i-1;j++) {
if(a[j] > a[j+1])
swap(&a[j],&a[j+1]);
}
}
int med_n = (n+1) / 2 - 1; //alegem valoarea din mijloc
float moisture = a[med_n];
Serial.println(moisture);
return moisture;
}

void setup()
{
pinMode(sensor, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Median = " );
lcd.setCursor(0, 1);
lcd.print("Spices = " );
}
int i = 0;
void loop() //funcția pentru masurarea umiditatii
{

float moists[5];
Serial.println("MEASURING...");
if (i < 4){
moists[i] = getMoisture();
}
if (i >= 4){
sw(moists);
moists[4] = getMoisture();
}
float val1 = weighted_median(moists);
float val2 = salt_and_pepper(moists);
disp(val1, val2);
delay(1000);

i++;
}

Concluzie
În această lucrare de laborator am avut de creat o aplicație de tip MCU pentru a prelua un semnal cu
ajutorul unul sensor și de a transforma informația primită în 2 filtre, și de a o afișa pe un LCD. Am folosit
2 senzori: 1 de determinare a temperaturii, și al doilea de determinare al umidității. După care am
transformat datele primile de la sensor în media aritmetică ponderată și în filtrul sare și piper.

You might also like