Étape 2: Capteur de température d’un seul fil + Code
Je me suis arrangé les composants sur un montage d’essai suivant le schéma ci-dessus, puis j’ai téléchargé le fichier zip disponible ici (http://bildr.org/2011/07/ds18b20-arduino/) et suivre le processus en deux étapes nécessaire pour imprimer les données de température pour le moniteur de la série. Parce que je fournis le code mis à jour le capteur ci-dessous, toutefois, il vous suffit Placez le dossier « Un fil » dans la bibliothèque de l’Arduino et vous devrait être bon d’aller.
Pour obtenir le fondu de LED, j’avais besoin pour stocker les deux dernières valeurs de comparaison et de faire que j’ai fait une copie de la fonction getTemp(), renomme et appelé les deux fonctions en tandem avec un décalage entre les deux. Le code fini (avec LED assignés et fade établi) n’est pas aussi optimal qu’il pourrait l’être, cependant il semble fonctionner parfaitement.
Notez également quelles broches sont assignés aux couleurs et s’assurer que cela se reflète sur le montage d’essai.
#define REDPIN1 10
#define GREENPIN1 9
#define BLUEPIN1 11
#define REDPIN2 5
#define GREENPIN2 6
#define BLUEPIN2 3
#define FADESPEED 8 / / supérieure à ralentir en font
#include < OneWire.h >
flotteur tempData [1] ;
flotteur tempDataPrev [1] ;
int DS18S20_Pin = 2 ; Broche DS18S20 Signal numérique 2
Température à puce d’e/s
OneWire ds(DS18S20_Pin) ; sur la broche numérique 2
void setup(void) {}
Serial.Begin(9600) ;
pinMode (REDPIN1, sortie) ;
pinMode (GREENPIN1, sortie) ;
pinMode (BLUEPIN1, sortie) ;
pinMode (REDPIN2, sortie) ;
pinMode (GREENPIN2, sortie) ;
pinMode (BLUEPIN2, sortie) ;
}
Violet valeur 200, 0, 255
Rouge valeur 255, 0, 0
Bleu la valeur 0, 0, 255
void loop(void) {}
flotteur de température = getTemp() ;
Delay(1000) ;
float temperaturePrev = getTempPrev() ;
int i ;
int r1, g1, b1 ;
int r2, g2, b2 ;
pour (int i = 0; i < 1; i ++) {}
tempDataPrev [i] = temperaturePrev;}
pour (int i = 0; i < 1; i ++) {}
tempData [i] = température;}
analogWrite (BLUEPIN1, 255) ;
analogWrite (REDPIN1, 255) ;
analogWrite (GREENPIN1, 0) ;
analogWrite (BLUEPIN2, 255) ;
analogWrite (REDPIN2, 255) ;
analogWrite (GREENPIN2, 0) ;
Si (tempDataPrev [0] == {tempData[0])}
valeurs initiales
analogWrite (BLUEPIN1, 255) ;
analogWrite (REDPIN1, 255) ;
analogWrite (GREENPIN1, 0) ;
analogWrite (BLUEPIN2, 255) ;
analogWrite (REDPIN2, 255) ;
analogWrite (GREENPIN2, 0) ;
}
Si (tempDataPrev [0] < tempData[0]) {}
analogWrite (BLUEPIN2, 255) ;
analogWrite (REDPIN2, 255) ;
analogWrite (GREENPIN2, 0) ;
du violet au bleu à violet
pour (r1 = 255 ; r1 > 0; r1--) {}
analogWrite (REDPIN1, r1) ;
Delay(FADESPEED);}
pour (r1 = 0; r1 < 256 ; r1 ++) {}
analogWrite (REDPIN1, r1) ;
Delay(FADESPEED);}
}
Si (tempDataPrev [0] > {tempData[0])}
analogWrite (BLUEPIN1, 255) ;
analogWrite (REDPIN1, 255) ;
analogWrite (GREENPIN1, 0) ;
du violet au rouge, au violet
pour (b2 = 255 ; b2 > 0; b2--) {}
analogWrite (BLUEPIN2, b2) ;
Delay(FADESPEED);}
pour (b2 = 0; b2 < 256 ; b2 ++) {}
analogWrite (BLUEPIN2, b2) ;
Delay(FADESPEED);}
} }
flotteur getTempPrev() {}
renvoie la température d’un DS18S20 en degrés Celsius
octet de données [12] ;
addr octet [8] ;
Si (! ds.search(addr)) {}
pas plus de capteurs sur chaîne, réinitialiser recherche
DS.reset_search() ;
retour -1000 ;
}
Si (OneWire::crc8 (addr, 7)! = {addr[7])}
Serial.println (« le CRC est non valide!") ;
retour -1000 ;
}
Si (addr [0]! = 0 x 10 & & addr [0]! = 0 x 28) {}
Serial.Print ("la périphérique n’est pas reconnu") ;
retour -1000 ;
}
DS.Reset() ;
DS.Select(addr) ;
DS.Write(0x44,1) ; lancer la conversion, avec puissance parasite sur à la fin
octet présent = ds.reset() ;
DS.Select(addr) ;
DS.Write(0xBE) ; Bloc-notes de lecture
pour (int i = 0; j’ai < 9; i ++) {/ / nous avons besoin de 9 octets
données [i] = ds.read() ;
}
DS.reset_search() ;
octet MSB = données [1] ;
octet LSB = data [0] ;
float tempRead = ((MSB << 8) | LSB) ; à l’aide de deux compliment
float TemperatureSum = tempRead / 16 ;
Return TemperatureSum ;
}
flotteur getTemp() {}
renvoie la température d’un DS18S20 en degrés Celsius
Delay(2000) ;
octet de données [12] ;
addr octet [8] ;
Si (! ds.search(addr)) {}
pas plus de capteurs sur chaîne, réinitialiser recherche
DS.reset_search() ;
retour -1000 ;
}
Si (OneWire::crc8 (addr, 7)! = {addr[7])}
Serial.println (« le CRC est non valide!") ;
retour -1000 ;
}
Si (addr [0]! = 0 x 10 & & addr [0]! = 0 x 28) {}
Serial.Print ("la périphérique n’est pas reconnu") ;
retour -1000 ;
}
DS.Reset() ;
DS.Select(addr) ;
DS.Write(0x44,1) ; lancer la conversion, avec puissance parasite sur à la fin
octet présent = ds.reset() ;
DS.Select(addr) ;
DS.Write(0xBE) ; Bloc-notes de lecture
pour (int i = 0; j’ai < 9; i ++) {/ / nous avons besoin de 9 octets
données [i] = ds.read() ;
}
DS.reset_search() ;
octet MSB = données [1] ;
octet LSB = data [0] ;
float tempRead = ((MSB << 8) | LSB) ; à l’aide de deux compliment
float TemperatureSum = tempRead / 16 ;
Return TemperatureSum ;
}