Paso 2: El código
Muestra el proceso de medir la temperatura y mostrando en la pantalla OLED.
Cuando la temperatura cae por debajo de 8 grados Celsius (temperatura ideal para la cerveza), envía un SMS con el GPRSbee.
#include < OneWire.h >
#include < Wire.h >
#include < SeeedOLED.h >
#include < GPRSbee.h >
#define GPRSBEE_PWRPIN 7
#define XBEECTS_PIN 8
OneWire ds(2); en el pin 2
int sent_sms = 0; sólo queremos enviar un sms una vez
Float beertemp;
bool smsSent;
void setup() / *---(configuración: funciona una vez)---* /
{
Serial.Begin(9600); Serial1 está conectado a GPRSbee SIM900
gprsbee.init (serie, XBEECTS_PIN, GPRSBEE_PWRPIN);
gprsbee.OFF();
Wire.Begin();
SeeedOled.init(); initialze pantalla OLED de SEEED
SeeedOled.clearDisplay(); borrar la pantalla y establecer la posición de inicio a la parte superior izquierda esquina
SeeedOled.setNormalDisplay(); Ponga la pantalla en modo normal (es decir no inverso modo)
SeeedOled.setPageMode(); Modo direccionamiento a modo de página
} / *--(configuración final)---* /
void loop() / *---(bucle: funcionamientos constantemente)---* /
{
SeeedOled.setTextXY(0,0); Establecer el cursor a Xth Page, columna Yth
SeeedOled.putString("Beer(oC):"); Imprimir la cadena
beertemp = OWtemp();
SeeedOled.putFloat(beertemp,1);
Si (beertemp < 8 & & sent_sms == 0) {}
sent_sms = 1; sólo enviar sms una vez
SeeedOled.setTextXY(4,0);
SeeedOled.putString ("enviando SMS");
SeeedOled.setTextXY(5,0);
smsSent = gprsbee.sendSMS ("la cerveza es frío", "+99999999"); número de teléfono incluyendo el código de país
Si (smsSent) {}
SeeedOled.setTextXY(6,0);
SeeedOled.putString (el "SMS enviado OK");
} else {}
SeeedOled.setTextXY(6,0);
SeeedOled.putString (el "SMS no enviados");
}
}
} / *--(bucle principal de la final)--* /
Float OWtemp(void) {}
byte me;
presente byte = 0;
type_s de bytes;
datos del octeto [12];
addr Byte [8] = "";
flotador de celsius;
DS.Search(ADDR);
DS.Reset();
DS.Select(ADDR);
DS.Write(0X44, 1); iniciar la conversión, con la energía del parásito en el final
Delay(1000); tal vez 750ms es bastante, quizás no
podríamos hacer un ds.depower() aquí, pero el reset se hará cargo de él.
actual = ds.reset();
DS.Select(ADDR);
DS.Write(0xBE); Bloc de notas de lectura
para (i = 0; i < 9; i ++) {/ / necesitamos 9 bytes
datos [i] = ds.read();
}
Convertir los datos a la temperatura real
porque el resultado es un entero con signo de 16 bits, debe
ser almacenados en un tipo de "int16_t", que es siempre de 16 bits
incluso cuando se compila en un procesador de 32 bits.
int16_t bruto = (datos [1] << 8) | datos [0];
Si (type_s) {}
materia prima = raw << 3; por defecto de resolución 9 bits
Si (datos [7] == 0 x 10) {}
"Conde siguen siendo" da resolución de 12 bits completo
materia prima = (materia prima y 0xFFF0) + 12 - datos [6];
}
} else {}
cfg de byte = (datos [4] y 0x60);
en baja resolución, los bits bajos son indefinidos, así que vamos a cero los
Si (cfg == 0 x 00) crudo = raw & ~ 7; resolución de 9 bits, ms 93,75
else if (cfg == 0 x 20) crudo = raw & ~ 3; resolución de 10 bits, ms 187,5
else if (cfg == 0 x 40) crudo = raw & ~ 1; resolución de 11 bits, de 375 ms
valor predeterminado es 12 bits de resolución, tiempo de conversión de ms 750
}
Celsius = (float) crudo / 16.0;
volver celsius;
}
/ * (El final) * /