diff --git a/pcsensor.c b/pcsensor.c
index 19b043e..7789bd2 100644
--- a/pcsensor.c
+++ b/pcsensor.c
@@ -45,10 +45,7 @@
 
 /* TEMPer type definition */
 
-#define MAX_DEV 8
-#define TEMPER_TYPES 3
-
-struct temper_type {
+typedef struct temper_type {
     const int vendor_id;
     const int product_id;
     const char product_name[256];
@@ -56,12 +53,19 @@ struct temper_type {
     const int has_sensor; // number of temperature sensor
     const int has_humid;  // flag for humidity sensor
     void (*decode_func)();
-};
+} temper_type_t;
+
+typedef struct temper_device {
+    libusb_device_handle *handle;
+    temper_type_t *type;
+} temper_device_t;
 
 void decode_answer_fm75();
 void decode_answer_sht1x();
 
-struct temper_type tempers[TEMPER_TYPES] = {
+#define TEMPER_TYPES 3
+
+temper_type_t tempers[TEMPER_TYPES] = {
     { 0x0c45, 0x7401, "TEMPer2",   1, 2, 0, decode_answer_fm75  }, // TEMPer2* eg. TEMPer2V1.3
     { 0x0c45, 0x7401, "TEMPer1",   0, 1, 0, decode_answer_fm75  }, // other 0c45:7401 eg. TEMPerV1.4
     { 0x0c45, 0x7402, "TEMPerHUM", 0, 1, 1, decode_answer_sht1x },
@@ -69,6 +73,8 @@ struct temper_type tempers[TEMPER_TYPES] = {
 
 /* global variables */
 
+#define MAX_DEV 8
+
 #define INTERFACE1 0x00
 #define INTERFACE2 0x01
 
@@ -116,7 +122,7 @@ void usb_detach(libusb_device_handle *lvr_winusb, int iInterface) {
     }
 }
 
-int find_lvr_winusb(libusb_device_handle **handles, int *types) {
+int find_lvr_winusb(temper_device_t *devices) {
     int i, j, s, cnt, numdev;
     libusb_device **devs;
 
@@ -143,27 +149,27 @@ int find_lvr_winusb(libusb_device_handle **handles, int *types) {
                 bus = libusb_get_bus_number(devs[i]);
                 port = libusb_get_port_number(devs[i]);
 
-                if ((s = libusb_open(devs[i], &handles[numdev])) < 0) {
+                if ((s = libusb_open(devs[i], &devices[numdev].handle)) < 0) {
                     fprintf(stderr, "Could not open USB device: %d\n", s);
                     continue;
                 }
 
-                libusb_get_string_descriptor_ascii(handles[numdev], desc.iManufacturer, descmanu, 256);
-                libusb_get_string_descriptor_ascii(handles[numdev], desc.iProduct, descprod, 256);
-                libusb_get_string_descriptor_ascii(handles[numdev], desc.iSerialNumber, descseri, 256);
+                libusb_get_string_descriptor_ascii(devices[numdev].handle, desc.iManufacturer, descmanu, 256);
+                libusb_get_string_descriptor_ascii(devices[numdev].handle, desc.iProduct, descprod, 256);
+                libusb_get_string_descriptor_ascii(devices[numdev].handle, desc.iSerialNumber, descseri, 256);
 
                 if (tempers[j].check_product_name) {
                     if (strncmp((const char*)descprod, tempers[j].product_name, strlen(tempers[j].product_name)) == 0) {
-                        types[numdev] = j;
+                        devices[numdev].type = &tempers[j];
                     }
                     else {
                         // vid and pid match, but product name unmatch
-                        libusb_close(handles[numdev]);
+                        libusb_close(devices[numdev].handle);
                         continue; 
                     }
                 }
                 else {
-                    types[numdev] = j;
+                    devices[numdev].type = &tempers[j];
                 } 
 
                 if (debug) {
@@ -181,7 +187,7 @@ int find_lvr_winusb(libusb_device_handle **handles, int *types) {
     return numdev;
 }
 
-int setup_libusb_access(libusb_device_handle **handles, int *types) {
+int setup_libusb_access(temper_device_t *devices) {
     int i;
     int numdev;
 
@@ -193,28 +199,28 @@ int setup_libusb_access(libusb_device_handle **handles, int *types) {
         libusb_set_debug(ctx, 0); //LIBUSB_LOG_LEVEL_NONE
     }
 
-    if((numdev = find_lvr_winusb(handles, types)) < 1) {
+    if((numdev = find_lvr_winusb(devices)) < 1) {
         fprintf(stderr, "Couldn't find the USB device, Exiting: %d\n", numdev);
         return -1;
     }
 
     for (i = 0; i < numdev; i++) {
-        usb_detach(handles[i], INTERFACE1);
-        usb_detach(handles[i], INTERFACE2);
+        usb_detach(devices[i].handle, INTERFACE1);
+        usb_detach(devices[i].handle, INTERFACE2);
 
-        if (libusb_set_configuration(handles[i], 0x01) < 0) {
+        if (libusb_set_configuration(devices[i].handle, 0x01) < 0) {
             fprintf(stderr, "Could not set configuration 1\n");
             return -1;
         }
 
         // Microdia tiene 2 interfaces
         int s;
-        if ((s = libusb_claim_interface(handles[i], INTERFACE1)) < 0) {
+        if ((s = libusb_claim_interface(devices[i].handle, INTERFACE1)) < 0) {
             fprintf(stderr, "Could not claim interface. Error:%d\n", s);
             return -1;
         }
 
-        if ((s = libusb_claim_interface(handles[i], INTERFACE2)) < 0) {
+        if ((s = libusb_claim_interface(devices[i].handle, INTERFACE2)) < 0) {
             fprintf(stderr, "Could not claim interface. Error:%d\n", s);
             return -1;
         }
@@ -312,8 +318,7 @@ void decode_answer_sht1x(unsigned char *answer, float *tempd, float *calibration
 };
 
 int main(int argc, char **argv) {
-    libusb_device_handle **handles;
-    int *types;
+    temper_device_t *devices;
     int numdev,i;
     unsigned char *answer;
     float tempd[2];
@@ -380,9 +385,8 @@ int main(int argc, char **argv) {
         exit(EXIT_FAILURE);
     }
 
-    handles = calloc(MAX_DEV, sizeof(libusb_device_handle*));
-    types = calloc(MAX_DEV, sizeof(int));
-    if ((numdev = setup_libusb_access(handles, types)) < 1) {
+    devices = calloc(MAX_DEV, sizeof(temper_device_t*));
+    if ((numdev = setup_libusb_access(devices)) < 1) {
         exit(EXIT_FAILURE);
     }
 
@@ -407,9 +411,9 @@ int main(int argc, char **argv) {
 
     do {
         for (i = 0; i < numdev; i++) {
-            control_transfer(handles[i], uTemperature);
-            interrupt_read(handles[i], answer);
-            tempers[types[i]].decode_func(answer, tempd, calibration);
+            control_transfer(devices[i].handle, uTemperature);
+            interrupt_read(devices[i].handle, answer);
+            devices[i].type->decode_func(answer, tempd, calibration);
 
             t = time(NULL);
             local = localtime(&t);
@@ -426,19 +430,19 @@ int main(int argc, char **argv) {
             if (formato==2) {
                 // in Fahrenheit
                 printf("%s\t%d\tinternal\t%.2f F\n", strdate, i, (9.0 / 5.0 * tempd[0] + 32.0));
-                if (tempers[types[i]].has_sensor == 2) {
+                if (devices[i].type->has_sensor == 2) {
                     printf("%s\t%d\texternal\t%.2f F\n", strdate, i, (9.0 / 5.0 * tempd[1] + 32.0));
                 }
             } else {
                 // in Celsius
                 printf("%s\t%d\tinternal\t%.2f C\n", strdate, i, tempd[0]);
-                if (tempers[types[i]].has_sensor == 2) {
+                if (devices[i].type->has_sensor == 2) {
                     printf("%s\t%d\texternal\t%.2f C\n", strdate, i, tempd[1]);
                 }
             }
 
             // print humidity
-            if (tempers[types[i]].has_humid == 1) {
+            if (devices[i].type->has_humid == 1) {
                 printf("%s\t%d\thumidity\t%.2f %%\n", strdate, i, tempd[1]);
             }
 
@@ -448,10 +452,10 @@ int main(int argc, char **argv) {
     } while (!bsalir);
 
     for (i = 0; i < numdev; i++) {
-        libusb_release_interface(handles[i], INTERFACE1);
-        libusb_release_interface(handles[i], INTERFACE2);
+        libusb_release_interface(devices[i].handle, INTERFACE1);
+        libusb_release_interface(devices[i].handle, INTERFACE2);
 
-        libusb_close(handles[i]);
+        libusb_close(devices[i].handle);
     }
 
     return 0;