Stap 2: Één draad temperatuursensor + Code
Ik regelde de componenten op een breadboard na het diagram hierboven, dan ik gedownload het zip-bestand hier gevonden (http://bildr.org/2011/07/ds18b20-arduino/) en volgde het proces in twee stappen nodig om de temperatuur gegevens naar de seriële monitor te drukken. Omdat ik verstrek de gemodificeerde sensor onderstaande code, allen u moet plaats de "Één Wire"-map in de Arduino library en u moet echter goed om te gaan.
Voor de verwezenlijking van de LED-fade, nodig ik voor het opslaan van de laatste twee waarden voor de vergelijking, en te doen dat ik een kopie van de getTemp()-functie maakte, omgedoopt het tot, en de twee functies genoemd in tandem met een vertraging tussen. De afgewerkte code (met LED pinnen toegewezen en fade vastgesteld) is niet zo optimaal is als het zou kunnen zijn, nochtans schijnt het feilloos functioneren.
Merk ook op welke pinnen de kleuren worden toegewezen aan, en ervoor te zorgen dat dit wordt weerspiegeld op het breadboard.
#define REDPIN1 10
#define GREENPIN1 9
#define BLUEPIN1 11
#define REDPIN2 5
#define GREENPIN2 6
#define BLUEPIN2 3
#define FADESPEED 8 / / maken dit hoger te vertragen
#include < OneWire.h >
float tempData [1];
float tempDataPrev [1];
int DS18S20_Pin = 2; DS18S20 signaal pin op digitale 2
Temperatuur chip i/o
Privacy ds(DS18S20_Pin); op digitale pin 2
ongeldig setup(void) {}
Serial.begin(9600);
pinMode (REDPIN1, uitvoer);
pinMode (GREENPIN1, uitvoer);
pinMode (BLUEPIN1, uitvoer);
pinMode (REDPIN2, uitvoer);
pinMode (GREENPIN2, uitvoer);
pinMode (BLUEPIN2, uitvoer);
}
Violet waarde 200, 0, 255
Waarde voor rood 255, 0, 0
Blauwe waarde 0, 0, 255
ongeldig loop(void) {}
zweven temperatuur = getTemp();
delay(1000);
zweven temperaturePrev = getTempPrev();
int i;
int r1, g1, b1;
int r2, g2, b2;
for (int i = 0; ik < 1; i ++) {}
tempDataPrev [i] = temperaturePrev;}
for (int i = 0; ik < 1; i ++) {}
tempData [i] = temperatuur;}
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
Als (tempDataPrev [0] == tempData[0]) {}
Beginwaarden
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
}
Als (tempDataPrev [0] < tempData[0]) {}
analogWrite (BLUEPIN2, 255);
analogWrite (REDPIN2, 255);
analogWrite (GREENPIN2, 0);
van violet blauw naar violet
voor (r1 = 255 r1 > 0; r1--) {}
analogWrite (REDPIN1, r1);
delay(FADESPEED);}
voor (r1 = 0; r1 < 256; r1 ++) {}
analogWrite (REDPIN1, r1);
delay(FADESPEED);}
}
Als (tempDataPrev [0] > tempData[0]) {}
analogWrite (BLUEPIN1, 255);
analogWrite (REDPIN1, 255);
analogWrite (GREENPIN1, 0);
van violet tot rood tot violet
voor (b2 = 255 b2 > 0; b2--) {}
analogWrite (BLUEPIN2, b2);
delay(FADESPEED);}
voor (b2 = 0; b2 < 256; b2 ++) {}
analogWrite (BLUEPIN2, b2);
delay(FADESPEED);}
} }
float getTempPrev() {}
geeft als resultaat de temperatuur van een DS18S20 in graden Celsius
bytegegevens [12];
byte addr [8];
Als (! ds.search(addr)) {}
geen meer sensoren op de keten, reset zoeken
DS.reset_search();
Return-1000;
}
Als (OneWire::crc8 (addr, 7)! = addr[7]) {}
Serial.println ("CRC is niet geldig!");
Return-1000;
}
Als (addr [0]! = 0x10 & & addr [0]! = 0x28) {}
Serial.Print ('apparaat wordt niet herkend');
Return-1000;
}
DS.reset();
DS.Select(addr);
DS.write(0x44,1); Start conversie, met kracht van de parasiet op eind
byte aanwezig = ds.reset();
DS.Select(addr);
DS.write(0xBE); Lees Kladblok
voor (int i = 0; ik < 9; i ++) {/ / moeten we 9 bytes
gegevens [i] = ds.read();
}
DS.reset_search();
byte MSB = data [1];
byte LSB = data [0];
zweven tempRead = ((MSB << 8) | LSB); met behulp van twee compliment
zweven TemperatureSum = tempRead / 16;
Return TemperatureSum;
}
float getTemp() {}
geeft als resultaat de temperatuur van een DS18S20 in graden Celsius
delay(2000);
bytegegevens [12];
byte addr [8];
Als (! ds.search(addr)) {}
geen meer sensoren op de keten, reset zoeken
DS.reset_search();
Return-1000;
}
Als (OneWire::crc8 (addr, 7)! = addr[7]) {}
Serial.println ("CRC is niet geldig!");
Return-1000;
}
Als (addr [0]! = 0x10 & & addr [0]! = 0x28) {}
Serial.Print ('apparaat wordt niet herkend');
Return-1000;
}
DS.reset();
DS.Select(addr);
DS.write(0x44,1); Start conversie, met kracht van de parasiet op eind
byte aanwezig = ds.reset();
DS.Select(addr);
DS.write(0xBE); Lees Kladblok
voor (int i = 0; ik < 9; i ++) {/ / moeten we 9 bytes
gegevens [i] = ds.read();
}
DS.reset_search();
byte MSB = data [1];
byte LSB = data [0];
zweven tempRead = ((MSB << 8) | LSB); met behulp van twee compliment
zweven TemperatureSum = tempRead / 16;
Return TemperatureSum;
}