/** * Devuelve la temperatura en Celcius y Fahrenheit de termómetros * infrarrojos MLX90614, conectados a los pines TWI/I²C (en la tarjeta * Wiring v1: 0 (SCL) y 1 (SDA) y en la tarjeta Wiring S: 8 (SCL) y 9 (SDA)). */ #include //Biblioteca - Libreria que permite la comunicación I2C #include // Esta biblioteca le permite comunicarse con dispositivos I2C #include "Math.h" const int ledPin = 7; // pin11 Pin de la alarma visual (led). const int buzzerPin = 5; // pin9 Pin de la alarma sonora (zumbador). const int rele_PE = 6; //pin 10 Pin del relé (Parada de emergencia de máquina plegadora). const int rele_Tool = 8; //pin 12 Pin del relé (Parada de herramienta). const int nMaxDevices = 20; //Número máximo de dispositivos que se pueden conectar.Este parámetro se puede cambiar. float TempAlarmaMin = 28; //Configura la temperatura mínima que provoca la alarma. float TempAlarmaMax = 37; //Configura la temperatura máxima que provoca la alarma. // int deviceAddress[nMaxDevices]; //Array que contiene las direcciones de los sensores conectados. float celcius[nMaxDevices]; // Array que contiene la temperatura en Celcius de cada sensor conectado. int nDevices=0; //Número de dispositivos conectados int ledState = LOW; int State = 0; void setup() { Scanner(); //Escanea los dispositivos conectados al bus i2c. Serial.begin(9600); // Inicia la comunicación serial a 9600bps. pinMode(ledPin, OUTPUT); //Configuración de ledPin como Pin o señal de salida pinMode(buzzerPin, OUTPUT); //Configuración de buzzerPin como Pin o señal de salida pinMode(rele_PE, OUTPUT); //Configuración de rele_PE como Pin o señal de salida pinMode(rele_Tool, OUTPUT); //Configuración de rele_Tool como Pin o señal de salida digitalWrite(rele_PE, LOW); //Inicializa la señal rele_PE apagada digitalWrite(rele_Tool, LOW); //Inicializa la señal rele_Tool apagada digitalWrite(ledPin, LOW); //Inicializa la señal ledPin apagada digitalWrite(buzzerPin, LOW); //Inicializa la señal buzzerPin apagada i2c_init(); // Inicia el bus i2c. //PORTC = (1 << PORTC4) | (1 << PORTC5); // Habilita ‘pullups’. } void loop() { for(int i=0;i= TempAlarmaMin && celcius[i]<=TempAlarmaMax) //Si Tª es mayor que TempAlarmaMax (30ºC) activa la alarma y el relé. { State=1; //Serial.print(" ->A "); //Imprime en el puerto serial A=Alarma } else { } if(i!=10){ Serial.print(";"); } } if (State== 1) //Activa las señales del buzzer y el led. Desactiva los dos reles. { digitalWrite(rele_PE, LOW); digitalWrite(rele_Tool, LOW); digitalWrite(ledPin, HIGH); digitalWrite(buzzerPin, HIGH); } else //Desactiva la señales de buzzer y el led. Activa los dos reles. { digitalWrite(rele_PE, HIGH); digitalWrite(rele_Tool, HIGH); digitalWrite(ledPin, LOW); digitalWrite(buzzerPin, LOW); } State=0; Serial.print("\n"); delay(10); } // Espera un segundo para imprimir de nuevo. ///////////////////////////////////////////////////////////////////////////////////////////// //temperatureCelsius(): Función para obtener la temepratura que está midiendo un sensor IR.// ///////////////////////////////////////////////////////////////////////////////////////////// float temperatureCelcius(int address) { int dev = address; int data_low = 0; int data_high = 0; int pec = 0; // Escribe i2c_start_wait(dev+I2C_WRITE); i2c_write(0x07); // Lee i2c_rep_start(dev+I2C_READ); data_low = i2c_readAck(); // Lee 1 byte y envía ack. data_high = i2c_readAck(); // Lee 1 byte y envía ack pec = i2c_readNak(); i2c_stop(); // Esto convierte los bytes altos y bajos juntos y procesa la temperatura. double tempFactor = 0.02; // 0.02 grados por LSB (medida de // resolución del MLX90614). double tempData = 0x0000; int frac; // Datos después del punto decimal. // Esto oculta el error del byte alto y lo mueve a la izquierda // 8 bits y agrega el byte bajo. tempData = (double)(((data_high & 0x007F) << 8) + data_low); tempData = (tempData * tempFactor)-0.01; float celcius = tempData - 273.15; // Retorna la temperatura en Celcius. return celcius; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Scanner(): Función que obtiene la dirección I2C de cada sensor IR conectado y la guarda en el array DeviceAddress[].// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void Scanner() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); Serial.println("Scanning..."); byte error, address; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); deviceAddress[nDevices] = (address)<<1; nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else { Serial.println("done"); Serial.print("nDevices = "); Serial.println(nDevices); Serial.print("\n");} for(int i=0;i