Temperaturkänsliga Infinity Mirror (2 / 6 steg)
Steg 2: En Wire temperatursensor + kod
Jag ordnade komponenterna på en skärbräda efter diagrammet ovan, då jag laddat ner zip-filen finns här (http://bildr.org/2011/07/ds18b20-arduino/) och följde tvåstegsprocess och nödvändigt att skriva ut temperaturdata till seriell bildskärmen. Eftersom jag ge modifierade sensor koden nedan, behöver du placera mappen "En Wire" till Arduino biblioteket och du bör dock vara bra att gå.
För att uppnå den LED vissna, behövde jag för att lagra de sista två värdena för jämförelse, och att göra att jag gjorde en kopia av funktionen getTemp(), döpte om den till, och kallas de två funktionerna tillsammans med en fördröjning i mellan. Färdiga koden (med LED stift tilldelat och fade etablerade) är inte så optimalt som det kunde vara, men det verkar att fungera felfritt.
Tänk också på vilka stift färgerna tilldelas, och se till att detta återspeglas på en skärbräda.
#define REDPIN1 10
#define GREENPIN1 9
#define BLUEPIN1 11
#define REDPIN2 5
#define GREENPIN2 6
#define BLUEPIN2 3
#define FADESPEED 8 / / gör detta högre för att bromsa
#include < OneWire.h >
float tempData [1].
float tempDataPrev [1].
int DS18S20_Pin = 2; DS18S20 Signal stift på digital 2
Temperaturen chip i/o
OneWire ds(DS18S20_Pin); på digital stift 2
void setup(void) {
Serial.BEGIN(9600);
pinMode (REDPIN1, OUTPUT);
pinMode (GREENPIN1, OUTPUT);
pinMode (BLUEPIN1, OUTPUT);
pinMode (REDPIN2, OUTPUT);
pinMode (GREENPIN2, OUTPUT);
pinMode (BLUEPIN2, OUTPUT);
}
Violet värdet 200, 0, 255
Röd värde 255, 0, 0
Blå värdet 0, 0, 255
void loop(void) {
flyta temperatur = getTemp();
Delay(1000);
flyta temperaturePrev = getTempPrev();
int i;
int r1, g1, b1;
int r2, g2, b2;
för (int jag = 0; jag < 1; i ++) {
tempDataPrev [i] = temperaturePrev;}
för (int jag = 0; jag < 1; i ++) {
tempData [i] = temperatur;}
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
om (tempDataPrev [0] == tempData[0]) {
ursprungliga värden
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
}
om (tempDataPrev [0] < tempData[0]) {
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
från violett till blått till violett
för (r1 = 255, r1 > 0, r1--) {
analogWrite (REDPIN1, r1);
Delay(FADESPEED);}
för (r1 = 0; r1 < 256; r1 ++) {
analogWrite (REDPIN1, r1);
Delay(FADESPEED);}
}
om (tempDataPrev [0] > tempData[0]) {
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
från violett till rött till violett
för (b2 = 255, b2 > 0, b2--) {
analogWrite (BLUEPIN2, b2);
Delay(FADESPEED);}
för (b2 = 0; b2 < 256; b2 ++) {
analogWrite (BLUEPIN2, b2);
Delay(FADESPEED);}
} }
float getTempPrev() {
Returnerar temperaturen från en DS18S20 i grader Celsius
byte data [12].
byte addr [8].
om (! ds.search(addr)) {
Inga fler sensorer på kedja, Återställ sökning
DS.reset_search();
återvända-1000;
}
om (OneWire::crc8 (addr, 7)! = addr[7]) {
Serial.println ("CRC är inte giltig!");
återvända-1000;
}
om (addr [0]! = 0x10 & & addr [0]! = 0x28) {
Serial.Print ("enhet identifieras inte");
återvända-1000;
}
DS.Reset();
DS.Select(addr);
DS.write(0x44,1); Starta konvertering, med parasit driver på i slutet
byte närvarande = ds.reset();
DS.Select(addr);
DS.write(0xBE); Läs Scratchpad
för (int jag = 0; jag < 9; i ++) {/ / vi behöver 9 byte
data [i] = ds.read();
}
DS.reset_search();
byte MSB = data [1].
byte LSB = data [0];
flyta tempRead = ((MSB << 8) | LSB); med hjälp av två komplimang
flyta TemperatureSum = tempRead / 16;
återvända TemperatureSum;
}
float getTemp() {
Returnerar temperaturen från en DS18S20 i grader Celsius
Delay(2000);
byte data [12].
byte addr [8].
om (! ds.search(addr)) {
Inga fler sensorer på kedja, Återställ sökning
DS.reset_search();
återvända-1000;
}
om (OneWire::crc8 (addr, 7)! = addr[7]) {
Serial.println ("CRC är inte giltig!");
återvända-1000;
}
om (addr [0]! = 0x10 & & addr [0]! = 0x28) {
Serial.Print ("enhet identifieras inte");
återvända-1000;
}
DS.Reset();
DS.Select(addr);
DS.write(0x44,1); Starta konvertering, med parasit driver på i slutet
byte närvarande = ds.reset();
DS.Select(addr);
DS.write(0xBE); Läs Scratchpad
för (int jag = 0; jag < 9; i ++) {/ / vi behöver 9 byte
data [i] = ds.read();
}
DS.reset_search();
byte MSB = data [1].
byte LSB = data [0];
flyta tempRead = ((MSB << 8) | LSB); med hjälp av två komplimang
flyta TemperatureSum = tempRead / 16;
återvända TemperatureSum;
}