306 lines
6.4 KiB
C
306 lines
6.4 KiB
C
int adcCount;
|
|
int shtClk=11;
|
|
int shtData=10;
|
|
int ioByte;
|
|
int ackBit;
|
|
double retVal; // Return value from SHT11
|
|
//--------//
|
|
int tC; // Temperatura en ºC
|
|
int rhLin; // Humedad
|
|
int rhTrue; // humedad relatica con tC
|
|
//-------//
|
|
int dly;
|
|
int cmdByte;
|
|
int dataByte1, dataByte2, pin, valor,i;
|
|
uint8_t bitmask;
|
|
//para switch de puertas 1 ESTÁ CERRADA
|
|
int open_8=1;
|
|
int open_9=1;
|
|
|
|
|
|
|
|
void SHT_Write_Byte(void) {
|
|
pinMode(shtData, OUTPUT);
|
|
shiftOut(shtData, shtClk, MSBFIRST, ioByte);
|
|
pinMode(shtData, INPUT);
|
|
digitalWrite(shtData, LOW);
|
|
digitalWrite(shtClk, LOW);
|
|
digitalWrite(shtClk, HIGH);
|
|
ackBit = digitalRead(shtData);
|
|
digitalWrite(shtClk, LOW);
|
|
}
|
|
|
|
int shiftIn() {
|
|
int cwt;
|
|
cwt=0;
|
|
bitmask=128;
|
|
while (bitmask >= 1) {
|
|
digitalWrite(shtClk, HIGH);
|
|
cwt = cwt + bitmask * digitalRead(shtData);
|
|
digitalWrite(shtClk, LOW);
|
|
bitmask=bitmask/2;
|
|
}
|
|
return(cwt);
|
|
}
|
|
void SHT_Read_Byte(void) {
|
|
ioByte = shiftIn();
|
|
digitalWrite(shtData, ackBit);
|
|
pinMode(shtData, OUTPUT);
|
|
digitalWrite(shtClk, HIGH);
|
|
digitalWrite(shtClk, LOW);
|
|
pinMode(shtData, INPUT);
|
|
digitalWrite(shtData, LOW);
|
|
}
|
|
|
|
void SHT_Connection_Reset(void) {
|
|
shiftOut(shtData, shtClk, LSBFIRST, 255);
|
|
shiftOut(shtData, shtClk, LSBFIRST, 255);
|
|
}
|
|
|
|
void SHT_Soft_Reset(void) {
|
|
SHT_Connection_Reset();
|
|
ioByte = 30;
|
|
ackBit = 1;
|
|
SHT_Write_Byte();
|
|
delay(15);
|
|
}
|
|
|
|
void SHT_Wait(void) {
|
|
delay(5);
|
|
dly = 0;
|
|
while (dly < 600) {
|
|
if (digitalRead(shtData) == 0) dly=2600;
|
|
delay(1);
|
|
dly=dly+1;
|
|
}
|
|
}
|
|
|
|
void SHT_Start(void) {
|
|
digitalWrite(shtData, HIGH);
|
|
pinMode(shtData, OUTPUT);
|
|
digitalWrite(shtClk, HIGH);
|
|
digitalWrite(shtData, LOW);
|
|
digitalWrite(shtClk, LOW);
|
|
digitalWrite(shtClk, HIGH);
|
|
digitalWrite(shtData, HIGH);
|
|
digitalWrite(shtClk, LOW);
|
|
|
|
}
|
|
|
|
void SHT_Measure(int vSvc) {
|
|
SHT_Soft_Reset();
|
|
SHT_Start();
|
|
ioByte = vSvc;
|
|
SHT_Write_Byte();
|
|
SHT_Wait();
|
|
ackBit = 0;
|
|
SHT_Read_Byte();
|
|
int msby;
|
|
msby = ioByte;
|
|
ackBit = 1;
|
|
SHT_Read_Byte();
|
|
retVal = msby;
|
|
retVal = retVal * 0x100;
|
|
retVal = retVal + ioByte;
|
|
if (retVal <= 0) retVal = 1;
|
|
}
|
|
|
|
int SHT_Get_Status(void) {
|
|
SHT_Soft_Reset();
|
|
SHT_Start();
|
|
ioByte = 7;
|
|
SHT_Write_Byte();
|
|
SHT_Wait();
|
|
ackBit = 1;
|
|
SHT_Read_Byte();
|
|
return(ioByte);
|
|
}
|
|
|
|
void SHT_Heater(void) {
|
|
SHT_Soft_Reset();
|
|
SHT_Start();
|
|
ioByte = 6;
|
|
SHT_Write_Byte();
|
|
ioByte = 4;
|
|
SHT_Write_Byte();
|
|
ackBit = 1;
|
|
SHT_Read_Byte();
|
|
delay(500);
|
|
SHT_Soft_Reset();
|
|
SHT_Start();
|
|
ioByte = 6;
|
|
SHT_Write_Byte();
|
|
ioByte = 0;
|
|
SHT_Write_Byte();
|
|
ackBit = 1;
|
|
SHT_Read_Byte();
|
|
}
|
|
|
|
//Write Temp or Humidity via serial 1->tem 2->humidity
|
|
void SHT_write(unsigned int temporal ){
|
|
if (temporal==1){
|
|
// SHT11 #1 Temperature
|
|
SHT_Measure(3);
|
|
|
|
retVal = retVal*0.01 - 40; //conversion a ºC
|
|
tC = retVal;
|
|
Serial.println(retVal, DEC);
|
|
|
|
}
|
|
if (temporal==2){
|
|
|
|
// SHT11 #1 Humidity
|
|
SHT_Measure(5);
|
|
rhLin = (retVal * 0.0405) - (retVal * retVal * 0.0000028) - 4;
|
|
rhTrue = (tC - 25) * (retVal * 0.00008 + 0.01) + rhLin;
|
|
retVal = rhTrue;
|
|
Serial.println(retVal, DEC);
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
|
|
for (i=1;i<14;i++){
|
|
pinMode(i,OUTPUT);
|
|
}
|
|
pinMode(8,INPUT);
|
|
pinMode(9,INPUT);
|
|
|
|
digitalWrite(11, HIGH);
|
|
//Recordar que el 10 y el 11 están reservados para SHT11
|
|
|
|
Serial.begin(9600); // open serial
|
|
SHT_Connection_Reset();
|
|
//test de inicio
|
|
digitalWrite(13, HIGH);
|
|
delay(2000);
|
|
digitalWrite(13, LOW);
|
|
|
|
}
|
|
|
|
void loop(){
|
|
|
|
|
|
//EL pin 8 y 9 son para comprobar si está o no abieto el contacto
|
|
//open_8 está a 0 y si se abre se pone a uno hasta que se hace una
|
|
lectura del pin con el comando
|
|
//D8 o D9
|
|
//A la hora de codificar cada una de las salidas digitales
|
|
//mediante el router, estableceremos como norma, codificar
|
|
//el estado HIGH para el pin 2 como: "H02". Y para un estado
|
|
//LOW: "L02". Para referirnos a las entradas analógicas,
|
|
//lo indicaremos anteponiendo la A: "A5".
|
|
//Dado que la comunicación serie, se lleva a cabo, como la
|
|
//propia palabra indica, mediante secuencia de bytes, entonces
|
|
//tendremos que llevar un control de los "paquetes" de datos
|
|
//para identificar correctamente los 3 bytes de una codificacion
|
|
//del estilo "H02"
|
|
//Los pines 10 y 11 digitales están reservados para el SHT11
|
|
//Para leerlo sólo hay que poner AT, para temperatura y AH para
|
|
humedad
|
|
if (digitalRead(8)==0){
|
|
open_8=0;
|
|
|
|
}
|
|
if (digitalRead(9)==0){
|
|
open_9=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Comprobamos si llega señal del router:
|
|
if (Serial.available()){
|
|
cmdByte=Serial.read();
|
|
//En caso de que el primer byte sea una H o una L, nos
|
|
//preparamos para decodificar el pin, leyendo, previamente
|
|
//el número de dicho pin. Para ello transformamos su nº
|
|
//a entero, restando al código ascii, 48
|
|
if (cmdByte==72 || cmdByte==76) //H or L
|
|
{
|
|
while(! Serial.available()){
|
|
}
|
|
dataByte1=Serial.read();
|
|
while(! Serial.available()){
|
|
}
|
|
dataByte2=Serial.read();
|
|
|
|
pin=(dataByte1-48)*10+dataByte2-48;
|
|
|
|
if(cmdByte==72){
|
|
digitalWrite(pin,HIGH);
|
|
}
|
|
else{
|
|
digitalWrite(pin,LOW);
|
|
}
|
|
}
|
|
//En caso de que fuese A, entonces es un
|
|
//puerto analógico
|
|
|
|
if (cmdByte==65){
|
|
//primero hacemos la lectura del pin en cuestión:
|
|
while(! Serial.available()){
|
|
}
|
|
dataByte1=Serial.read();
|
|
|
|
pin=dataByte1;
|
|
switch (pin) {
|
|
case 84://T
|
|
{
|
|
SHT_write(1);
|
|
break;
|
|
}
|
|
case 72: //H
|
|
{
|
|
SHT_write(2);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
valor=analogRead(pin);
|
|
|
|
Serial.println(valor,DEC);
|
|
}
|
|
|
|
}
|
|
}
|
|
//en caso de ser D es un tema de puertas
|
|
if (cmdByte==68){
|
|
//primero hacemos la lectura del pin en cuestión:
|
|
while(! Serial.available()){
|
|
}
|
|
dataByte1=Serial.read();
|
|
|
|
pin=dataByte1-48;
|
|
//Si es una alarma es una A (llamada DA)
|
|
if (pin==17){
|
|
if(open_8==0) {
|
|
Serial.println("D8");
|
|
}
|
|
else
|
|
{
|
|
Serial.println(0,DEC);
|
|
}
|
|
}
|
|
//Si es la lectura de una de las puertas, la 8 o 9
|
|
if(pin==8){
|
|
Serial.println(open_8,DEC);
|
|
|
|
open_8=1;
|
|
}
|
|
if(pin==9){
|
|
Serial.println(open_9,DEC);
|
|
open_9=1;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|