Paso 5: El código
Resumen: Horas de duro trabajo y frustración condensan en un archivo de solo texto. Este es el final (sobre todo) trabajando bosquejo, escrito específicamente con un Arduino Uno en mente.servoSweep() controla el exploración y almacenamiento de datos
tempRead() incluye todas las tonterías de i2c y recupera los datos desde el sensor de temperatura
findHot() devuelve el servo a la posición con la temperatura más caliente
Este es mi primer intento de codificación de Arduino, así que siéntete libre de dejarme saber si he hecho cosas claramente complicadas o torpe. La primera iteración funciona muy bien, pero después de el conflicto de las bibliotecas de Servo y i2cmaster y el servo va un poco las tuercas. Si alguien lo soluciona, póngase en contacto con me y actualizaré el código.
** TrackFan ** / /
Código y concepto por ePums
código de tempRead por Dave Eaton y SensorJunkie
#include < Servo.h >
#include < i2cmaster.h >
Servo mrservo;
int j = 0;
int pos;
int posVals [] = {}
0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120
};
doble tempVals [12];
int hotPos;
void tempRead() {}
Definir función de lectura de la temperatura del Sensor IR.
int dev = 0x5A << 1;
int data_low = 0;
int data_high = 0;
pec de int = 0;
i2c_start_wait(dev+I2C_WRITE);
i2c_write(0x07);
i2c_rep_start(dev+I2C_READ);
data_low = i2c_readAck(); Lee 1 byte y luego enviar ack
data_high = i2c_readAck(); Lee 1 byte y luego enviar ack
PEC = i2c_readNak();
i2c_stop();
Esto convierte alta y baja bytes juntos y los procesos de temperatura, MSB es un error y se omite en temps
doble tempFactor = 0,02; 0,02 grados por LSB
tempData doble = 0 x 0000;
int frac;
Esta máscaras off el bit de error de byte alto, entonces se mueve 8 bits a la izquierda y añade el byte bajo.
tempData = (doble) (((data_high & 0x007F) << 8) + data_low);
tempData = (tempData * tempFactor) -0.01;
tempData = tempData - 273.15;
tempVals [j] = tempData;
j += 1;
}
void servoSweep() {}
Serial.println ("servoSweep inicializar!");
j = 0;
pos = 0;
pos de RESET y los índices de temperatura
Delay(500);
Serial.println("positions:");
regresar a servo a la posición inicial
para (pos = 0; pos < 130; pos += 10)
{
mrservo.Write(POS);
mover servo 10 grados
Delay(200);
permite sensor resolver
tempRead();
Serial.println(POS);
leer y almacenar datos de temperatura
Delay(300);
}
}
void findHot() {}
Serial.println (¡ «findHot iniciado!");
encontrar la temperatura más alta, mover el servo a la posición correspondiente
int i = 0;
Índice de búsqueda local
int q = 0;
doble hotTemp = tempVals [0];
los datos de posición asociados con la temperatura más alta en un barrido determinado
para (i = 0; i < 13; i += 1) {}
Si (tempVals [i] > = hotTemp) {}
hotTemp = tempVals [i];
Serial.Print ("#" + String(i) + "caliente temperatura:");
Serial.println(hotTemp);
Delay(50);
q = i;
recuperar el índice de valor temp más alto en tempVals matriz
}
}
hotPos = posVals [q];
Serial.println ("hotPos:");
Serial.Print(hotPos);
recuperar el valor correspondiente de la posición de índice de posVals
Si (mrservo.attached()) {}
Serial.println ("Esto es leer la salida de ahora");
}
Delay(1000);
mrservo.Detach();
mrservo.Attach(3);
mrservo.Write(hotPos);
Delay(1000);
mover el servo
Serial.println ("volviendo a hotPos");
** DEMORA ENTRE EXPLORACIONES ** / / /
Delay(10000);
i = 0;
}
void setup() {}
Serial.Begin(9600);
i2c_init();
PORTC = (1 << PORTC4) | (1 << PORTC5);
}
void loop() {}
mrservo.Attach(3);
Delay(1000);
mrservo.Write(0);
i2c_init();
servoSweep();
Serial.println("temperatures!");
para (int n = 0; n < 13; n += 1) {}
Serial.println(tempVals[n]);
Delay(50);
}
findHot();
mrservo.Detach();
Delay(2000);
}