1. Jakab Zsolt 2015 Page 1
Instalatie de masura si inregistrare a temperaturii si a
umiditatii din hala de productie in diferite puncte
2015
Jakab Zsolt
Cuprins:
1 Tema de proiect ………………………………………………………………………………………… 2
2 Proiectare ,costuri, realizare fizica …………………………………………………………….. 3
3 Anexe …………………………………………………………………………………………………………. 9
2. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
2
1.Tema de proiect
Se cere crearea unui sistem care poate masura si stoca valorile temperaturii
si umiditatii din diferite puncte ale halei.
Propun folosirea unei Placi de dezvoltare Arduino UNO conectata la un
calculator si a unor senzori de temperatura si umiditate, interconectate precum in
desenul de ma jos:
Fig.1 Schema bloc propusa
2 Proiectare , realizare fizica
Pentru masura se vor folosi senzori de tipul DHT22 , cu caracteristicile
principale redate in tabelul de jos.
3. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
3
Marimile determinate de senzori se transmit digilal placii Arduino UNO
printr-un protocol special de comunicare cu un singur fir de date.
Canalul de transmisie a datelor dintre senzori si placa de dezvoltare este
realzat cu cablul YSLCY-JZ 3X1,5
Parametrii lineici ai cablului :
- R=0.06 ohm/m
- L=0.021 mH/m
- C=0.26 nF/m.
Din cauza parametrilor transversali si a lungimilor canalului de transmisii de
date se produce atenuarea si deformarea semnalului transmis.
Se impune limitarea lungimii acestuia la max 130m pentru nivelele TTL de 5V .
Datorita lungimilor diferite dintre senzori si placa de dezvoltare se va folosi
montajul P1 de mai jos, care permite reglaj de adaptare de impedanta.
Fig.3 Placa P1 de conectica si sursa de alimentare
4. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
4
Pentru a asigura stocarea datelor dupa o pauza de curent este nevoie de
repornirea automata a calculatorului. La nivel hardware acestlucru se face prin
montajul P2.
Placa P2 , sursa UPS , restart PC
Placa de achizitii de date Arduino comunica cu calculatorul prin protocol
RS232 master-slave. Se impune adaptarea nivelelor de tensiune pentru aceasta
conexiune cu montajul P3 deoarece portul PC foloseste semal diferential de 15V si
placa ARDUINO foloseste semnale de 5V.
Placa P3, interfata RS232 – TTL Arduino
Proiectarea si executia unor parti a sistemului a inceput in data de 15.07.2015 in
limita costurilor uzuale calculate in fabrica.
5. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
5
Fig 4. Proiectare, desenare, gaurire, vopsire trasee pe cablaj imprimat
Fig. 5 Corodarea placii in clorura ferica si plantarea pieselor
6. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
6
Ansamblul de montaje construite au fost introduse in carcasa calculatorului
achizitionat pentru a reduce spatiul si inclusiv costurile
Fig. 5 integrarea constructiva a montajelor in masina de calcul
Interfata grafica cu sistemului e creat prin programul LabWindowsCVI si
arata ca in figurile 6 si 7.
Prima fereastra contine butonul “interval” care permite selectarea periodicitatii
stocarii datelor pe memoria calculatorului. Deoarece variatia temperaturii si
implicit a umiditatii este un process lent se considera suficienta memorarea
valorilor citite in intervale de 10/15 minute.
Afisajele grafice si numerice au o rata de reinoire a valorilor temperaturii si
umiditatii de 1 secunda. Pe afisajele grafice curbele de culoare rosie reprezinta
variatia temperaturii si cele albastre reprezinta variatia umiditatii.
7. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
7
Fig. 6 interfata grafica
Butonul “OPEN FILE” deschide o fereastra de dialog care permite selectarea
fisierului cu citirile corespunzatoare senzorului droit.
Fig. 7 selectarea fisierului cu citirile corespunzatoare senzorului dorit
Numele fisierelor sunt :
- DATADHT1 pentru senzorul DHT22(1) plasat in zona MA2
- DATADHT2 pentru senzorul DHT22(2) plasat in zona PRATI2
- DATADHT3 pentru senzorul DHT22(3) plasat in zona ETI
8. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
8
Apoi dupa selectarea fisierului de date , o alta fereastra se deschide automat (fig.8)
in care se afiseaza grafic valorile inregistrate pe calculator din cadrul fisierului
selectat.
Fig. 8 interpretor grafic al datelor
Prin miscarea cursorului din butoanele “+” si “-‘” se afiseaza in mod explicit
sub partea de jos a graficului paramtrii care caracterizeaza acel punct dat.
9. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
9
ANEXE
1 Program principal
#include <ansi_c.h>
#include <formatio.h>
#include <utility.h>
#include <cvirte.h> /* Needed if linking in external compiler;
harmless otherwise */
#include <userint.h>
#include "datalog.h"
#include <rs232.h>
static int p1 ,p2;
int com=1,interval=1,btg=0;
int cntwf=0,period=0,PlotFileHandle=0,ph,pt;
int xindex,xindexmax;
char
Rx[250],T[9],D[11],DHT1[110],DHT2[110],DHT3[110],file[260],filetoopen[
260];
char Get_NR(char ch);
void GetTimeDate(void);void WriteToFile(void);
void ComCallback(int portNumber, int eventMask, void *callbackdata) ;
float GetFloat(char w1,char w2,char w3,char w4,char c);
//====================================================================
=================================================================
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in
external compiler; harmless otherwise */
return -1; /* out of memory */
if ((p1 = LoadPanel (0, "datalog.uir", P1)) < 0)
return -1;
DisplayPanel (p1);
OpenComConfig(com,0,9600,0,8,1,56,56);
InstallComCallback (com,LWRS_RECEIVE, 56, 0, ComCallback, 0);
SetCtrlVal(P1,P1_T," ");SetCtrlVal(P1,P1_D," ");
RunUserInterface ();
return 0;
}
//====================================================================
==================================================================
int CVICALLBACK out (int panel, int event, void *callbackData,int
eventData1, int eventData2)
{
switch (event) {case EVENT_CLOSE:QuitUserInterface (0);break;}
return 0;
10. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
10
}
//====================================================================
==================================================================
void ComCallback(int portNumber, int eventMask, void *callbackdata)
{
int i=0;
if (eventMask == LWRS_RECEIVE)
{
SuspendTimerCallbacks();
GetTimeDate();
for(i=0;i<100;i++){DHT1[i]=DHT2[i]=DHT3[i]=0;}for(i=0;i<250;i++){Rx[i]
=0;}
i=ComRdTerm(com,Rx,220,0);
if(i>70)
{
for(i=0;i<72;i++){DHT1[i]=Rx[i];DHT2[i]=Rx[i+74];DHT3[i]=Rx[i+148];}
strcat(DHT1," DATE:
");strcat(DHT1,D);strcat(DHT1," TIME:
");strcat(DHT1,T);//strcat(DHT1,"n");
strcat(DHT2," DATE:
");strcat(DHT2,D);strcat(DHT2," TIME:
");strcat(DHT2,T);//strcat(DHT1,"n");
strcat(DHT3," DATE:
");strcat(DHT3,D);strcat(DHT3," TIME:
");strcat(DHT3,T);//strcat(DHT1,"n");
}
FlushInQ (com);
ResumeTimerCallbacks();
}
}
//====================================================================
==================================================================OK
int CVICALLBACK tick (int panel, int control, int event,void
*callbackData, int eventData1, int eventData2)
{
float xdata1[2],xdata2[2],xdata3[2];;
if (event==EVENT_TIMER_TICK) {
btg=~btg;
SetCtrlVal(P1,P1_LED,btg);
GetTimeDate();
xdata1[0]=GetFloat(DHT1[11],DHT1[12],DHT1[14],DHT1[15],3);SetCtrlVal(P
1,P1_MA2H,xdata1[0]);
xdata1[1]=GetFloat(DHT1[33],DHT1[34],DHT1[36],DHT1[37],3);SetCtrlVal(P
1,P1_MA2T,xdata1[1]);
PlotStripChart
(P1,P1_G1,xdata1,2,0,0,VAL_FLOAT);
11. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
11
xdata2[0]=GetFloat(DHT2[11],DHT2[12],DHT2[14],DHT2[15],3);SetCtrlVal(P
1,P1_PRATI2H,xdata2[0]);
xdata2[1]=GetFloat(DHT2[33],DHT2[34],DHT2[36],DHT2[37],3);SetCtrlVal(P
1,P1_PRATI2T,xdata2[1]);
PlotStripChart
(P1,P1_G2,xdata2,2,0,0,VAL_FLOAT);
xdata3[0]=GetFloat(DHT3[11],DHT3[12],DHT3[14],DHT3[15],3);SetCtrlVal(P
1,P1_ETIH,xdata3[0]);
xdata3[1]=GetFloat(DHT3[33],DHT3[34],DHT3[36],DHT3[37],3);SetCtrlVal(P
1,P1_ETIT,xdata3[1]);
PlotStripChart
(P1,P1_G3,xdata3,2,0,0,VAL_FLOAT);
period= interval*60;
if(cntwf<period)cntwf++;
if(cntwf==period){WriteToFile();
cntwf=0;}
}
return 0;
}
//====================================================================
============================================================
//====================================================================
========================== OK
char Get_NR(char ch)
{
switch (ch)
{
case '0':return 0;break; case '1':return 1;break;
case '2':return 2;break;
case '3':return 3;break; case '4':return 4;break;
case '5':return 5;break;
case '6':return 6;break; case '7':return 7;break;
case '8':return 8;break;
case '9':return 9;break;
}
return 0;
}
//=============================================== GetTime&DATE
===============================================// OK
void GetTimeDate(void)
//
12. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
12
{
//
char H[3],M[3],S[3],De[3],Mo[3],Ye[5];
//
int h[1],m[1],s[1],de[1],mo[1],ye[1];
//
GetSystemTime(h,m,s);GetSystemDate(mo,de,ye);
//
Fmt(H,"%d",h[0]);
//
Fmt(M,"%d",m[0]);
//
Fmt(S,"%d",s[0]);
//
Fmt(Mo,"%d",mo[0]);
//
Fmt(De,"%d",de[0]);
//
Fmt(Ye,"%d",ye[0]);
//
//
if(h[0]<10){H[1]=H[0];H[0]='0';}
//
if(m[0]<10){M[1]=M[0];M[0]='0';}
//
if(s[0]<10){S[1]=S[0];S[0]='0';}
//
if(de[0]<10){De[1]=De[0];De[0]='0';}
//
if(mo[0]<10){Mo[1]=Mo[0];Mo[0]='0';}
//
//
T[0]=H[0];T[1]=H[1];T[2]=':';
//
T[3]=M[0];T[4]=M[1];T[5]=':';
//
T[6]=S[0];T[7]=S[1];T[8]=0;
//
//
D[0]=De[0];D[1]=De[1];D[2]='-';
//
13. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
13
D[3]=Mo[0];D[4]=Mo[1];D[5]='-';
//
D[6]=Ye[0];D[7]=Ye[1];D[8]=Ye[2];D[9]=Ye[3];D[10]=0;
//
DeleteTextBoxLine(P1,P1_D,0); DeleteTextBoxLine(P1,P1_T,0);
//
if(T[0]==0)SetCtrlVal(P1,P1_T," ");else SetCtrlVal(P1,P1_T,T);
//
if(D[0]==0)SetCtrlVal(P1,P1_D," ");else SetCtrlVal(P1,P1_D,D);
//
}
//
//====================================================================
========================================//
//====================================================================
========================================//
void WriteToFile(void)
{
int i=0;
i=OpenFile("DATADHT1.txt",VAL_READ_WRITE,VAL_APPEND,VAL_ASCII);
WriteLine (i,DHT1,-1);
CloseFile (i);
i=OpenFile("DATADHT2.txt",VAL_READ_WRITE,VAL_APPEND,VAL_ASCII);
WriteLine (i,DHT2,-1);
CloseFile (i);
i=OpenFile("DATADHT3.txt",VAL_READ_WRITE,VAL_APPEND,VAL_ASCII);
WriteLine (i,DHT3,-1);
CloseFile (i);
}
//====================================================================
=================================================
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++
int CVICALLBACK OpenFileToPlot (int panel, int control, int event,void
*callbackData, int eventData1, int eventData2)
{
int n=0,i=0,cnt=0,*xdata;
char lineBuffer[150];
float *T,*H,D[2];
switch (event) {
case EVENT_LEFT_CLICK:
FileSelectPopup ("", ".txt",
".txt;.zsolt", "select data", 2, 0, 0, 1, 1, file);
strcpy(filetoopen,file);
PlotFileHandle=OpenFile(file,VAL_READ_ONLY,VAL_OPEN_AS_IS,VAL_ASCII);
14. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
14
while(n!=-2){
n=ReadLine(PlotFileHandle,lineBuffer,75);cnt++;} CloseFile
(PlotFileHandle);
T=malloc(cnt*sizeof(float));
H=malloc(cnt*sizeof(float)); xdata=malloc(cnt*sizeof(int));
PlotFileHandle=OpenFile(file,VAL_READ_ONLY,VAL_OPEN_AS_IS,VAL_ASCII);
p2 = LoadPanel (0, "datalog.uir",
P2) ;
DisplayPanel (p2);
for(i=0;i<cnt;i++)
{
ReadLine(PlotFileHandle,lineBuffer,75);
T[i]=GetFloat(lineBuffer[33],lineBuffer[34],lineBuffer[36],lineBuffer[
37],3);
H[i]=GetFloat(lineBuffer[11],lineBuffer[12],lineBuffer[14],lineBuffer[
15],3);
xdata[i]=i;
}
CloseFile (PlotFileHandle);
if(pt!=0)DeleteGraphPlot (P2,P2_G4,pt,
1);
if(ph!=0)DeleteGraphPlot (P2,P2_G4,ph,
1);
pt=PlotXY
(P2,P2_G4,xdata,T,i,VAL_INTEGER,VAL_FLOAT,VAL_FAT_LINE,VAL_SIMPLE_DOT,
VAL_SOLID,1,VAL_RED);
// SetCtrlAttribute (P2,P2_G4,
ATTR_ACTIVE_YAXIS,2);
ph=PlotXY
(P2,P2_G4,xdata,H,i,VAL_INTEGER,VAL_FLOAT,VAL_FAT_LINE,VAL_SIMPLE_DOT,
VAL_SOLID,1,VAL_BLUE);
// SetCtrlAttribute (P2,P2_G4,
ATTR_ACTIVE_YAXIS,1);
SetGraphCursorIndex (P2,P2_G4,1,ph,i/2);
SetGraphCursorIndex (P2,P2_G4,2,pt,i/2);
xindexmax=i;
SetCtrlVal(P2,P2_TB,"moove
cursor");
break;
}
return 0;
}
15. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
15
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++
//============================================= GetFloat ()
==================================================// OK
float GetFloat(char w1,char w2,char w3,char w4,char c)
//
{
//
float value=0.00;
//
char z=0,u=0,d=0,s=0,d2=0;
//
if(c==2)
//
{
//
z=Get_NR(w1);
//
u=Get_NR(w2);
//
value=z*10+u;
//
}
//
if(c==3)
//
{
//
z=Get_NR(w1);
//
u=Get_NR(w2);
//
d=Get_NR(w3);
//
d2=Get_NR(w4);
//
value=z*10+u+d*0.1+d2*0.01;
//
16. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
16
}
//
if(c==4)
//
{
//
s=Get_NR(w1);
//
z=Get_NR(w2);
//
u=Get_NR(w3);
//
d=Get_NR(w4);
//
value=s*100+z*10+u+d*0.1;
//
}
//
return value;
//
}
//
//====================================================================
=============================================
int CVICALLBACK out2 (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event) {
case EVENT_CLOSE: if(p2!=0)DiscardPanel(p2);
pt=0;ph=0;xindex= 0;xindexmax=0;
break;
}
return 0;
}
//
int CVICALLBACK Up (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char linebuffer[250];
17. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
17
int yindex,n;
int cnt;
switch (event) {
case EVENT_COMMIT:
if(xindex<xindexmax-1)
{
xindex=xindex+1;
SetGraphCursorIndex
(P2,P2_G4,1,ph,xindex);
SetGraphCursorIndex (P2,P2_G4,2,pt,xindex);
}
PlotFileHandle=OpenFile(filetoopen,VAL_READ_ONLY,VAL_OPEN_AS_IS,VAL_AS
CII);
n=0; while(n<xindex){
ReadLine(PlotFileHandle,linebuffer,150);n++;}
SetCtrlVal(P2,P2_TB,linebuffer);
CloseFile (PlotFileHandle);
break;
}
return 0;
}
//--------------------------------------------------------------------
-------------------------------------------------
int CVICALLBACK Down (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char linebuffer[250];
int yindex,n;
int cnt;
switch (event) {
case EVENT_COMMIT:
if(xindex>0)
{
xindex=xindex-1;
SetGraphCursorIndex
(P2,P2_G4,1,ph,xindex);
SetGraphCursorIndex (P2,P2_G4,2,pt,xindex);
}
PlotFileHandle=OpenFile(filetoopen,VAL_READ_ONLY,VAL_OPEN_AS_IS,VAL_AS
CII);
n=0; while(n<xindex){
ReadLine(PlotFileHandle,linebuffer,150);n++;}
SetCtrlVal(P2,P2_TB,linebuffer);
CloseFile (PlotFileHandle);
18. Instalatie de masura si inregistrare a temperaturii si a umiditatii din hala de productie in diferite puncte
18
break;
}
return 0;
}
//====================================================================
===============================================
int CVICALLBACK set_inteval (int panel, int control, int event,void
*callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
GetCtrlVal(P1,P1_interval,&interval);
break;
}
return 0;
}
//====================================================================
===============================================
int CVICALLBACK movecursor (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int x,y;
float c;
switch (event) {
case EVENT_LEFT_CLICK: /*
GetRelativeMouseState(P2,P2_G4,&x,&y,0,0,0);
c=(int)xindexmax/x;
x=x*c;
if(x>0 && x<xindexmax)
{
SetGraphCursorIndex
(P2,P2_G4,1,ph,x);
SetGraphCursorIndex (P2,P2_G4,2,pt,x);
}
*/
break;
}
return 0;
}
2. Placa de achizitii
#include "DHT.h"
#define DHT1PIN 2
#define DHT2PIN 3
#define DHT3PIN 4