>>> wiring-0008
float tval0 = 0;
float tval1 = 0;
float tval2 = 0;
float tval3 = 0;
float tval4 = 0;
float tval5 = 0;
float value0 = 0;
float value1 = 0;
float value2 = 0;
float value3 = 0;
float value4 = 0;
float value5 = 0;
// define pin mapping
int qt401_drd = 2; // data ready
int qt401_di = 3; // data in (from sensor)
int qt401_ss = 4; // slave select
int qt401_clk = 5; // clock
int qt401_do = 6; // data out (to sensor)
int qt401_det = 7; // detect
int qt401_prx = 8; // proximity
byte x;
void qt401_init()
{
// define pin directions
pinMode(qt401_drd, INPUT);
pinMode(qt401_di, INPUT);
pinMode(qt401_ss, OUTPUT);
pinMode(qt401_clk, OUTPUT);
pinMode(qt401_do, OUTPUT);
pinMode(qt401_det, INPUT);
pinMode(qt401_prx, INPUT);
// initialise pins
digitalWrite(qt401_clk,HIGH);
digitalWrite(qt401_ss, HIGH);
}
// wait for the qt401 to be ready
void qt401_waitForReady(void)
{
while(!digitalRead(qt401_drd)){
continue;
}
}
// exchange a byte with the sensor
byte qt401_transfer(byte data_out)
{
byte i = 8;
byte mask = 0;
byte data_in = 0;
digitalWrite(qt401_ss,LOW); // select slave by lowering ss pin
delayMicroseconds(75); //wait for 75 microseconds
while(0 < i) {
mask = 0x01 << --i; // generate bitmask for the appropriate bit MSB first
// set out byte
if(data_out & mask){ // choose bit
digitalWrite(qt401_do,HIGH); // send 1
}
else{
digitalWrite(qt401_do,LOW); // send 0
}
// lower clock pin, this tells the sensor to read the bit we just put out
digitalWrite(qt401_clk,LOW); // tick
// give the sensor time to read the data
delayMicroseconds(75);
// bring clock back up
digitalWrite(qt401_clk,HIGH); // tock
// give the sensor some time to think
delayMicroseconds(20);
// now read a bit coming from the sensor
if(digitalRead(qt401_di)){
data_in |= mask;
}
// give the sensor some time to think
delayMicroseconds(20);
}
delayMicroseconds(75); // give the sensor some time to think
digitalWrite(qt401_ss,HIGH); // do acquisition burst
return data_in;
}
void qt401_calibrate(void)
{
// calibrate
qt401_waitForReady();
qt401_transfer(0x01);
delay(600);
// calibrate ends
qt401_waitForReady();
qt401_transfer(0x02);
delay(600);
}
void qt401_setProxThreshold(byte amount)
{
qt401_waitForReady();
qt401_transfer(0x40 & (amount & 0x3F));
}
void qt401_setTouchThreshold(byte amount)
{
qt401_waitForReady();
qt401_transfer(0x80 & (amount & 0x3F));
}
byte qt401_driftCompensate(void)
{
qt401_waitForReady();
return qt401_transfer(0x03);
}
byte qt401_readSensor(void)
{
qt401_waitForReady();
return qt401_transfer(0x00);
}
void setup()
{
//setup the sensor
qt401_init();
qt401_calibrate();
qt401_setProxThreshold(10);
qt401_setTouchThreshold(10);
pinMode(48,OUTPUT);
digitalWrite(48,HIGH); // sets the LED on
}
void loop()
{
if(digitalRead(qt401_det)){
x = qt401_readSensor();
if(0x80 & x){
x = x & 0x7f;
}
}
if (x>20 && x <35)
{
tval0 = 255;
tval1 = 0;
tval2 = 0;
tval3 = 0;
tval4 = 0;
tval5 = 0;
}
else if (x>35 && x<50) {
tval1 = 255;
tval0 = 0;
tval2 = 0;
tval3 = 0;
tval4 = 0;
tval5 = 0;
}
else if (x>50 && x<65) {
tval2 = 255;
tval1 = 0;
tval0 = 0;
tval3 = 0;
tval4 = 0;
tval5 = 0;
}
else if (x>65 && x<80) {
tval3 = 255;
tval1 = 0;
tval2 = 0;
tval0 = 0;
tval4 = 0;
tval5 = 0;
}
else if (x>80 && x<95) {
tval4 = 255;
tval1 = 0;
tval2 = 0;
tval3 = 0;
tval0 = 0;
tval5 = 0;
}
else if (x>95 && x<110) {
tval5 = 255;
tval1 = 0;
tval2 = 0;
tval3 = 0;
tval4 = 0;
tval0 = 0;
}
else if (x < 20) {
tval0 = 0;
tval1 = 0;
tval2 = 0;
tval3 = 0;
tval4 = 0;
tval5 = 0;
}
else if (x > 110) {
tval0 = 0;
tval1 = 0;
tval2 = 0;
tval3 = 0;
tval4 = 0;
tval5 = 0;
}
value0 = value0+(tval0-value0)*0.08;
value1 = value1+(tval1-value1)*0.08;
value2 = value2+(tval2-value2)*0.08;
value3 = value3+(tval3-value3)*0.08;
value4 = value4+(tval4-value4)*0.08;
value5 = value5+(tval5-value5)*0.08;
analogWrite(0, value0);
analogWrite(1, value1);
analogWrite(2, value2);
analogWrite(3, value3);
analogWrite(4, value4);
analogWrite(5, value5);
delay(5);
}
>>> back to main
|