0% au considerat acest document util (0 voturi)
211 vizualizări

Proiect Java Si Python

Documentul prezintă rezolvarea unui proiect în Java și Python care include parsarea unui fișier CSV cu date de la senzori în mai multe fișiere, afișarea datelor în grafice separate și conectarea la un microcontroller.

Încărcat de

Loredana Gheorghe
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
211 vizualizări

Proiect Java Si Python

Documentul prezintă rezolvarea unui proiect în Java și Python care include parsarea unui fișier CSV cu date de la senzori în mai multe fișiere, afișarea datelor în grafice separate și conectarea la un microcontroller.

Încărcat de

Loredana Gheorghe
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 15

Universitatea Politehnica din București – Facultatea de Inginerie

Mecanică și Mecatronică

Proiect Java și Python

Student:
Stan Andrada-Mihaela
Grupa 531B
Coordonator:
prof. Victor Constantin
1.Introducere
Etapa 1.1. – Java

Fișierul “date_senzori.csv” conține date de la 10 senzori (temperatură, umiditate, etc), alături


de data la care au fost făcute citirile (total 11 coloane).
Parsați fișierul (prezent pe platforma Moodle) prin intermediul unei aplicații Java, astfel încât
să obțineți:

- Un fișier “date_temperatura.csv”;
- Un fisier “date_umiditate.csv”;
- Un fisier “viteza.csv”;
- Un fisier “prezenta.csv”.
Fiecare fișier va conține, pe lângă datele din titlu și coloana cu data la care au fost făcute citirile.

Etapa 1.2. – Python

Afișați datele din fișierele obținute în etapa 1.1 în grafice în ferestre diferite, în funcție de
tipul datelor (un grafic cu toate citirile de temperatură în timp, unul pentru umiditate, etc.).
În paralel, în fire de execuție separate, realizați conectarea la un microcontroller prin interfața
RS232 și înregistrați datele primite într-un fișier csv nou (coloane date și timp).

2.Soluția proprie:
Etapa 1.1. – Java
import java.io.*; // se apelează biblioteca java.io.*
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;
public class proiect {
public static void main(String[] args) throws IOException {
System.out.println("Hello world!");//se afisează un mesaj
citire citire1 = new citire(); //instanțierea unui obiect
citire1.citire();
System.out.println("\n");//adăugare linie nouă
parcurgere temp = new parcurgere();//instanțierea unui obiect
parcurgere umid = new parcurgere();//instanțierea unui obiect
parcurgere viteza = new parcurgere();//instanțierea unui obiect
parcurgere prezenta = new parcurgere();//instanțierea unui obiect
temp.temperatura();//apelare metoda
umid.umiditate();//apelare metoda
viteza.viteza();//apelare metoda
prezenta.prezenta();//apelare metoda
}
}
class citire {
public void citire() {
try { //se încearca codul
BufferedReader citit = new BufferedReader(new FileReader("C:/Proiect/Date _orig.csv")); //se citesc datele din
fisierul csv
String rand;
while ( (rand = citit.readLine()) != null) { // se parcurg randurile pana se gaseste null
System.out.println(rand); //se afiseaza randul
}
}
catch (Exception e) {
System.err.println(e.getMessage()); // se afiseaza erorile posibile
}
}
}
class parcurgere {
int k = 0; //declarare contor
int z = 0; //declarare contor
File in = new File("C:/Proiect/Date _orig.csv");
List<String> lines = Files.readAllLines(in.toPath());
FileWriter date_temp = new FileWriter("C:/Proiect/Andrada/date_temperatura.csv"); //se realizeaza un fisier csv
pentru temperatura
FileWriter date_umid = new FileWriter("C:/Proiect/Andrada/date_umiditate.csv");//se realizeaza un fisier csv
pentru umiditate
FileWriter date_viteza = new FileWriter("C:/Proiect/Andrada/date_viteza.csv");//se realizeaza un fisier csv pentru
viteza
FileWriter date_prezenta = new FileWriter("C:/Proiect/Andrada/date_prezenta.csv");//se realizeaza un fisier csv
pentru prezenta
parcurgere() throws IOException {
}
public void temperatura() {
try {
char bom = '\uFEFF';
date_temp.write(bom);

for (String line:lines) { // se parcurge cu ajutorul structurii for fiecare rand si se adauga datele in fisierul
temperatura
String[] array = line.split(",");
if (k == 0) {
date_temp.write(array[0] + "," + array[1] + "," + array[2] + "," + array[array.length-1] + "\n");
k = k + 1;
}
else {
boolean y = false;
if (Double.parseDouble(array[0]) < -5) { //se verifica datele din fisierul temperatura daca se incadreaza in
intervalul (-5,5)
array[0] = String.valueOf(-5); //modificarea valorilor temperaturii
y = true;
}
if ( Double.parseDouble(array[1]) < -5) {
array[1] = String.valueOf(-5);
y = true;
}
if (Double.parseDouble(array[2]) < -5) {
array[2] = String.valueOf(-5);
y = true;
}
if (Double.parseDouble(array[0]) > 5) {
array[0] = String.valueOf(5);
y = true;
}
if ( Double.parseDouble(array[1]) > 5) {
array[1] = String.valueOf(5);
y = true;
}
if (Double.parseDouble(array[2]) > 5) {
array[2] = String.valueOf(5);
y = true;
}
if (y) {

z++;
}
date_temp.write(array[0] + ", " + array[1] + ", " + array[2] + ", " + array[array.length-3] + "\n");
k++;
}
} date_temp.close();
System.out.println("Numarul de erori in parsarea temperaturii: " + z); //afisarea erorilor in urma parsarii temperaturii
} catch (Exception e) {
System.err.println(e); // se afiseaza erorile posibile

}}
public void umiditate () {
try {
for (String line:lines) { { // se parcurge cu ajutorul structurii for fiecare rand si se adauga datele in fisierul umiditate
String[] array = line.split(",");
if (k == 0){
date_umid.write(array[3] + ", " + array[4] + ", " + array[5] + ", " + array[array.length-1] + "\n");
k = k + 1;
}
else {
boolean y = false;
if (Double.parseDouble(array[3]) < 40) {//se verifica datele din fisierul umiditate daca valoarea lor este mai mica de
40
array[3] = String.valueOf(40); // modificarea valorii umiditatii
y = true;
}
if ( Double.parseDouble(array[4]) < 40) {
array[4] = String.valueOf(40);
y = true;
}
if (Double.parseDouble(array[5]) < 40) {
array[5] = String.valueOf(40);
y = true;
}
if (y) {
z++;
}
date_umid.write(array[3] + ", " + array[4] + ", " + array[5] + ", " + array[array.length-3] + "\n");
k++;
}
} date_umid.close();
System.out.println("Numarul de erori in parsarea umiditatii: " + z); //afisarea erorilor in urma parsarii umiditatii

} catch (Exception e) {
System.err.println(e); // se afiseaza erorile posibile
}
}
public void viteza () {
try {
for (String line:lines) {// se parcurge cu ajutorul structurii for fiecare rand si se adauga datele in fisierul viteza
String[] array = line.split(",");
if (k == 0){
date_viteza.write(array[6] + ", " + array[array.length-1] + "\n");
k = k + 1;
}
else {
array[6] = String.valueOf(Double.parseDouble(array[6]) + 1);
date_viteza.write(array[6] + ", " + array[array.length-3] + "\n");
k++;
}
} date_viteza.close();
} catch (Exception e) {
System.err.println(e); // se afiseaza erorile posibile
}}
public void prezenta () {
try {
for (String line:lines) { // se parcurge cu ajutorul structurii for fiecare rand si se adauga datele in fisierul prezenta
String[] array = line.split(",");

if (k == 0){
date_prezenta.write(array[7] + ", " + array[8] + ", " + array[array.length-1] + "\n");
k = k + 1;}
else {
date_prezenta.write(array[7] + ", " + array[8] + ", " + array[array.length-3] + "\n");
k++;
}
} date_prezenta.close();
} catch (Exception e) {
System.err.println(e); // se afiseaza erorile posibile
}
}
}
Etapa 1.2. – Python
import csv
import matplotlib.pyplot as plt
import time
import threading
from threading import Thread
from queue import Queue
import serial

x=[]
y=[]
z=[]
w=[]

class ucontroller_manag (Thread): # s-a realizat un Thread pentru microcontroller


def get_data_uc(self): #metoda de preluare a datelor de catre microcontroller
if (self.connect_uc()==1): # verificare conexiunii cu microcontrollerul
while True:
while (self.port_uc.inWaiting()==0):
#print(",,,",)
#time.sleep(0.2)
continue
recv=self.port_uc.readline() # citirea datelor primite de la microcontroller
print (recv) # afisare date
time.sleep(2) #temporizare de 2 secunde

def connect_uc(self): #Connect to serial port of Arduino, returns 1 for ok connect #metoda de conectare cu
Arduino
self.tty = "COM7" # serial
self.baud = 115200 # baudrate
try:
self.port_uc=serial.Serial(self.tty, self.baud, timeout=3)
time.sleep(5) #setare timp de asteptare de 5 secunde
print ("Connected...") #mesaj conectare
return 1
except Exception as e:
print ("Error connecting to uC:\t",e) #mesaj in caz de eroare a conectarii
return 0

def run(self): #primirea datelor printr-o metoda de rulare


self.get_data_uc()
#Thread._init_(self)
class grafice_statice (Thread): #se creeaza un Thread pentru grafice
def run(self):
with open('date_temperatura.csv', 'r') as csvfile:
date = csv.reader(csvfile, delimiter=',')
#se citeste fisierul csv
for row in date:
#print (row)
pass

try:
y.append(float(row[0])) #se adauga datele de pe coloane
z.append(float(row[1]))
w.append(float(row[2]))
x.append(row[3])
except Exception as e:
#print ("Warning, error found: ", row) #in caz de eroare afisam un mesaj
pass

plt.figure(1) #se realizeaza graficul pentru temperatura


plt.plot(x,z, label='Temp 1!')
plt.plot(x,y, label='Temp 2!')
plt.plot(x,w, label='Temp 3!')
plt.xlabel('timp')
plt.ylabel('temperatura')
plt.title('temp(timp)')
plt.legend()
plt.xticks([0,50,99])

a=[]
b=[]
c=[]
d=[]

with open('date_umiditate.csv', 'r') as csvfile: #deschidem fisiereul cu date umiditate


date = csv.reader(csvfile, delimiter=',') #citim fisierul
for row in date:
try:
b.append(float(row[0])) #se adauga datele de pe coloane
c.append(float(row[1]))
d.append(float(row[2]))
a.append(row[3])
except Exception as e:
#print ("Warning, error found: ", row) #mesaj in caz de eroare
pass

plt.figure(2) #se realizeaza graficul pentru umiditate


plt.plot(a,c, label='Umid 1!')
plt.plot(a,b, label='Umid 2!')
plt.plot(a,d, label='Umid 3!')
plt.xlabel('timp')
plt.ylabel('umiditate %')
plt.title('umiditate(timp)')
plt.legend()
plt.xticks([0,50,99])

e=[]
f=[]
g=[]

with open('prezenta.csv', 'r') as csvfile: #deschidem fisiereul cu date prezenta


date = csv.reader(csvfile, delimiter=',') #citim fisierul
for row in date:
try:
f.append(float(row[0]))
g.append(float(row[1]))
e.append(row[2])
except Exception as error:
#print ("Warning, error found: ") #mesaj in caz de eroare
pass

#plt.figure(3) #se realizeaza graficul pentru prezenta


fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Stacked plots')
ax1.plot(e,g, label='Poz 1!')
ax2.plot(e,f, label='Poz 2!')
plt.xlabel('timp')
plt.ylabel('pozitie')
plt.title('pozitie(timp)')
plt.legend()
ax1.set_xticks([0,50,99])
ax2.set_xticks([0,50,99])
plt.figure(4)
i=[]
j=[]
with open('viteza.csv', 'r') as csvfile: #deschidem fisiereul cu date viteza
date = csv.reader(csvfile, delimiter=',') #citim fisierul
for row in date:
try:
i.append(float(row[0]))
j.append(row[1])
except Exception as e:
#print ("Warning, error found: ", row) #mesaj in caz de eroare
pass
plt.plot(j,i, label='Viteza 1!') #se realizeaza graficul pentru viteza
plt.xlabel('timp')
plt.ylabel('Viteza')
plt.title('Viteza(timp)')
plt.legend()
plt.xticks([0,50,99])
plt.show()
class thread_checker (Thread): #realizam o clasa de monitorizare a Thread-urilor
"""Clasa monitorizare threaduri"""
print ("Starting thread checker...")
def run (self):
a_old=[]
a=[]
a=threading.enumerate()
if a_old!=a:
print ("Current threads are: \n")
for i in threading.enumerate(): # afisam Thread-urile active
print ("\t", i)
time.sleep(2)
a_old=a

if _name_ == '_main_':

ucontroller=ucontroller_manag() #se initializeaza obiectul ucontroller


ucontroller.start() #se apeleaza metoda

grafice_stat=grafice_statice()
grafice_stat.start()

threader=thread_checker()
threader.start()

3.Testarea solutiei:
Fișierele csv realizate cu ajutorul programului în JAVA:
Grafice realizate în Python:

4.Concluzii
Valorile unor senzori au fost extrase cu ajutorul unui program realizat în Java fiind transferate în fișiere de tip csv, în
program am folosit parsarea pentru extragerea datelor. Urmând apoi cu ajutorul unui program în Python să realizam
grafice pentru valorile extrase din fisierele de tip csv.

S-ar putea să vă placă și