Étape 2: Le code
Il illustre le processus de mesure de la température et affichage sur l’écran OLED.
Lorsque la température descend en dessous de 8 degrés Celsius (température idéale pour la bière), il envoie un SMS à l’aide de la GPRSbee.
#include < OneWire.h >
#include < Wire.h >
#include < SeeedOLED.h >
#include < GPRSbee.h >
#define GPRSBEE_PWRPIN 7
#define XBEECTS_PIN 8
OneWire ds(2) ; sur la broche 2
int sent_sms = 0 ; Nous voulons seulement d’envoyer un sms une fois
float beertemp ;
bool smsSent ;
void setup() / *---(programme d’installation : s’exécute une fois)---* /
{
Serial.Begin(9600) ; Serial1 est connecté à SIM900 GPRSbee
gprsbee.init (série, XBEECTS_PIN, GPRSBEE_PWRPIN) ;
gprsbee.OFF() ;
Wire.Begin() ;
SeeedOled.init() ; initialze affichage OLED SEEED
SeeedOled.clearDisplay() ; effacer l’écran et de définir la position de départ à l’angle supérieur gauche
SeeedOled.setNormalDisplay() ; La valeur display mode normal (c’est à dire non-inverse mode)
SeeedOled.setPageMode() ; Mode d’adressage réglée en mode Page
} / *--(réglage fin)---* /
void loop() / *---(boucle : fonctionne en permanence)---* /
{
SeeedOled.setTextXY(0,0) ; Régler le curseur sur Xth Page, colonne Yth
SeeedOled.putString("Beer(oC):") ; Imprimer la chaîne
beertemp = OWtemp() ;
SeeedOled.putFloat(beertemp,1) ;
Si (beertemp < 8 & & sent_sms == 0) {}
sent_sms = 1 ; envoyer sms une fois
SeeedOled.setTextXY(4,0) ;
SeeedOled.putString ("envoi de SMS") ;
SeeedOled.setTextXY(5,0) ;
smsSent = gprsbee.sendSMS (« la bière est froide », "+99999999") ; Numéro de téléphone incluant le code pays
Si {(smsSent)
SeeedOled.setTextXY(6,0) ;
SeeedOled.putString ("SMS envoyé OK") ;
} else {}
SeeedOled.setTextXY(6,0) ;
SeeedOled.putString ("SMS non envoyé") ;
}
}
} / *--(boucle principale fin)--* /
flotteur OWtemp(void) {}
octet i ;
octet présent = 0 ;
type_s octet ;
octet de données [12] ;
addr octet [8] = "" ;
flotteur celsius ;
DS.Search(addr) ;
DS.Reset() ;
DS.Select(addr) ;
DS.Write(0x44, 1) ; lancer la conversion, avec puissance parasite sur à la fin
Delay(1000) ; 750ms est peut-être assez, peut-être pas
Nous pourrions faire un ds.depower() ici, mais la réinitialisation prendra soin de lui.
présent = ds.reset() ;
DS.Select(addr) ;
DS.Write(0xBE) ; Bloc-notes de lecture
pour (i = 0; j’ai < 9; i ++) {/ / nous avons besoin de 9 octets
données [i] = ds.read() ;
}
Convertir les données à la température actuelle
parce que le résultat est un entier signé de 16 bits, il se doit
être stocké pour un type de « int16_t », ce qui est toujours de 16 bits
même lorsque compilé sur un processeur de 32 bits.
int16_t brute = (données [1] << 8) | Data [0] ;
Si {(type_s)
brut = raw << 3 ; défaut de 9 bit résolution
Si (données [7] == 0 x 10) {}
« compte rester » donne plein 12 bits de résolution
brut = (brut & 0xFFF0) + 12 - données [6] ;
}
} else {}
cfg octet = (données [4] & 0 x 60) ;
à basse résolution, les bits de poids faibles ne sont pas définis, nous allons donc zéro eux
Si (cfg == 0 x 00) brut = raw & ~ 7 ; 9 bit résolution, 93,75 ms
ElseIf (cfg == 0 x 20) brut = raw & ~ 3 ; 10 bit res, 187,5 ms
ElseIf (cfg == 0 x 40) brut = raw & ~ 1 ; 11 bit res, 375 ms
valeur par défaut est 12 bits de résolution, temps de conversion 750 ms
}
Celsius = (float) brut / 16,0 ;
retour celsius ;
}
/ * (L’extrémité) * /