Risorse per il Lab. Elettronica
Home Page


CAD/CAE

LTspice

PSpice


Sistemi

Arduino

AVR

Raspberry Pi

National Instruments


Risorse

Datasheet

Link

Hardware e Software

Misc






Licenza Creative Commons
I seguenti documenti opera sono condivisi sotto i termini della licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported License.

Stazione meteo con NI USB-6008 e NI-DAQmx®


Come allestire una semplice stazione meteo per la misura della temperatura interna, temperatura esterna, umidità relativa, usando una scheda di acquisizione National Instruments USB-6008 e le API NI-DAQmx® per Visual C++
a cura di Francesco Parisi (fparisi [at] gmail [dot] com) - Versione 1.0 - Ultima revisione: 08 Aprile 2007

[Indice] [La scheda NI USB-6008] [Misura della temperatura interna] [Misura della temperatura esterna] [Il software di gestione]

Software di gestione

Il software di gestione usa la libreria NI-DAQmx e l'ambiente Microsoft Visual C++ 6.0. Sono state sviluppate due applicazioni: la prima in modalità console e la seconda in modalita grafica (sfruttando le MFC).

Applicazione console Win32 | Applicazione MFC

Viene effettuata una lettura continua ogni 500ms dei tre canali analogici di ingresso; la lettura viene interrotta dalla pressione di un tasto. Viene usata la sequenza di escape \r (ritorno di carrello) invece di \n (nuova linea) al fine di consentire la sovrascrittura della terna di valori precedenti, con la terna di valori attuali.


Output del programma

Di seguito il sorgente del file main.c :

/*  
 * Rilevazione meteo con NI-DAQmx	  
 * Versione 1.2 (applicazione console)  
 *   
 * http://telpar.altervista.org/ni-daqmx/meteo/
 *
 * Autore: Francesco Parisi 
 * Ultima revisione: 07/Aprile/2007
 *	
 * Hardware:        NI 6008-USB  
 * Compilatore/IDE: MS Visual C++ 6
 * Librerie:        NI-DAQmx C API 7.5
 *		
 * Motivazione:
 *
 *	  Acquisizione di tre segnali lentamente variabili, ad intervalli regolari,
 *	  mediante temporizzazione software interna, governata da un ciclo while
 *
 *	  CANALE1 (Dev1/ai0): Sensore LM35 (Temperatura interna)
 *	  CANALE2 (Dev1/ai1): Sensore AD590 (Temperatura esterna)	  
 *	  CANALE3 (Dev1/ai2): Sensore 2322 (Umidità relativa esterna)
 *
*/

#include <stdio.h>
#include <conio.h>
#include "C:\Programmi\National Instruments\NI-DAQ\DAQmx ANSI C Dev\include\NIDAQmx.h"
#include <windows.h>

#define CAL_INTERNA  +0.4   /* Calibrazione sensore temp. interna */
#define CAL_ESTERNA  -2.0   /* Calibrazione sensore temp. esterna */
#define CAL_UMIDITA  -3.0   /* Calibrazione sensore umidità relativa */

/* Funzione gestione errori */
int DAQmxErrChk (int32); 

int main(int argc, char *argv[])
{

	int32 taskHandle=0;              /* ID del task che verrà assegnato da DAQmxCreateTask */	
    float64 vet[3];	                 /* Vettore che contiene i campioni letti */    
	char input[] = "Dev1/ai0:2";	 /* Gli ingressi usati sono AI0, AI1 e AI2 */
	float64 minVal=0, maxVal=2.5;    /* Gli ingressi sono condizionati al range 0..2.5V */           
	int32 configInput=DAQmx_Val_RSE; /* Gli ingressi sono configurati come single-ended */		  
	int32 totale=0;			 /* Totale dei campioni acquisiti */
	int delay=500;                   /* La lettura viene scandita ogni delay msec */   	
	
		
    /*********************************************/
	/* CREAZIONE DEL TASK                        */
	/*********************************************/
   
    DAQmxErrChk( DAQmxCreateTask("Task_AI",&taskHandle) );	
  

    /*********************************************/
	/* CONFIGURAZIONE DEL TASK                   */
	/*********************************************/

	 DAQmxErrChk( 
	  DAQmxCreateAIVoltageChan(
		         taskHandle,
				 input,				
				 "",                
				 configInput,
				 minVal,
				 maxVal,
				 DAQmx_Val_Volts,
				 ""              
				 )
		);


		
	/*********************************************/
	/* AVVIO DEL TASK                            */
	/*********************************************/
	
	DAQmxErrChk( DAQmxStartTask(taskHandle) );
 
  
    /*********************************************/
    /* ESECUZIONE DEL TASK                       */
    /*********************************************/ 	

	printf ("\n\n\t\t\tRILIEVO PARAMETRI AMBIENTALI\n\n");

	while( !_kbhit() ) {	/* finché non premi un tasto, esegui: */	
		
		Sleep(delay);	/* aspetta delay millisecondi */	
	
        DAQmxErrChk(DAQmxReadAnalogF64(
		         taskHandle,      /* Leggi i campioni dal task identificato da taskHandle */
				 1,	  /* Quanti campioni per canale?  */
				 10,      /* Aspetta al piu` 10sec */
				 DAQmx_Val_GroupByScanNumber,	  /* Lettura a priorita' di canale */
				 vet,	  /* Indirizzo del vettore */
				 3,	  /* Dimensione del vettore vet */
				 &totale,         /* Numero di campioni letti */
				 NULL             /* -- non utilizzato -- */
				 ));

				 
        /**** STAMPA RISULTATI ****/ 

     	printf("TEMP. INTERNA: %3.1f C     TEMP. ESTERNA: %5.1f C     UMIDITA` RELATIVA: %3.0f%% \r", 
		   
	    vet[0] * 20 + CAL_INTERNA,  
		   
	    vet[1] * 29.2 + 250 - 273 + CAL_ESTERNA,	    
		
            vet[2] * 32 + 10 + CAL_UMIDITA);	
	}


    /*********************************************/
	/* STOP E CLEARING DEL TASK                  */
	/*********************************************/
	 
	if(taskHandle!=0)   {            /* ... se è stato creato il task */	
	    DAQmxStopTask(taskHandle);   /* fermalo */
		DAQmxClearTask(taskHandle);  /* libera le risorse impegnate per il task */
	}
	

	printf("\n\n\nProgramma terminato. Premere un tasto per uscire\n");
	getch();
	return 0;
}


int DAQmxErrChk (int32 status) 
{

	char errBuff[2048];
	if (status < 0)	{
	      DAQmxGetExtendedErrorInfo(errBuff,2048);
              fprintf(stderr, "DAQmx Error: %s\n",errBuff);			 
              return(1);
        } 

	else return 0; /* Nessun errore: ok oppure warning */
		  
}


Appendice


NI-DAQmx®, LabVIEW®, LabWindows/CVI® sono marchi registrati di National Instruments Corporation. Visual C++ è un marchio registrato di Microsoft Corporation. E' consentito l'utilizzo del materiale presente in queste pagine esclusivamente per scopi hobbistici, attività educative curriculari e comunque non di lucro. E' gradita la citazione della fonte. Questa pagina è visualizzabile con qualsiasi browser.

Informativa estesa sui Cookie | Web Statistics

Clicky

| Realizzazione a cura di Francesco Parisi (2002 ÷ 2024) | Contatti