Paso 4: La magia de regeneración
La película adjunta le mostrará la información en acción. Mira como la luz del LED en el SSR parpadea encendido y apagado. También puede calentar la velocidad del ventilador en respuesta a la carga eléctrica como la calefacción se enciende.
Con el 595 de AD, este proceso es sólo una cuestión de hacer algunas matemáticas en un
entrada analógica
//
Gracias a Karl Gruenewald para la fórmula de conversión
Todo el código publicado bajo
Creative Commons Attribution-Noncommercial-Share Alike 3.0
Esta versión se basa en la detección de temperatura con
un AD595 y termopar a través de un pin de A/D. Cualquier otro
sensor podría utilizarse sustituyendo esta uno función.
no dude en utilizar grados C así, sólo le dará otra
PID Sintonía que los de f el.
//
#define TEMP_SENSOR_PIN 0
#define SSD_PIN 2
Si usted ATA vRef de Arduino a la fuente de 3.3 voltios, cambiar esto a 3.3
#define ANALOG_VOTLAGE_REFERENCE 5
Float currentTemperature;
Float highTargetTemperature = 100;
Float lowTargetTemperature = 95;
void setup() {}
Serial.Begin(115200);
pinMode (SSD_PIN, salida);
}
void loop() {}
Imprime la temperatura actual con 1 lugar después del punto decimal
currentTemperature = getTemperature();
printFloat (currentTemperature, 1);
imprime un retorno de carro
Serial.println();
Si (currentTemperature < lowTargetTemperature) {}
digitalWrite (SSD_PIN, alto);
}
Si (currentTemperature > highTargetTemperature) {}
digitalWrite (SSD_PIN, bajo);
}
resto 100 milisegundos
Delay(100);
}
Float CtoF(float c) {}
Opcionalmente convertir de Celsius a Fahrenheit si usted está en esa cosa sorta
volver c * 9.0 / 5.0 + 32.0;
}
Float analogInToDegreesC(int inputValue) {}
División por 1023, el máximo valor posible de entrada, que escala la entrada entre 0 - 1
luego multiplique por la tensión de referencia, que escalas 0-1 0 - vREF (valor por defecto es 5V)
por último, multiplique por 100 para escalar a 10s de milivoltios o grados
volver inputValue / 1023.0 * ANALOG_VOTLAGE_REFERENCE * 100.0;
}
Float getTemperature() {}
Lee la entrada analógica, convertir a grados C y encubierta a F
volver CtoF(analogInToDegreesC(analogRead(TEMP_SENSOR_PIN)));
}
Sensor de temperatura de fin
printFloat imprime el flotador 'valor' redondeado 'lugares' lugares después del punto decimal
void printFloat (float valor, lugares de int) {}
se utiliza para la fundición de dígitos
int cifras;
decenas de flotador = 0.1;
int tenscount = 0;
int i;
Float tempfloat = valor;
Asegúrese de que nos ronda correctamente. Esto podría utilizar pow de < math.h >, pero no parece vale la pena la importación
Si este paso redondeo no es aquí, el valor 54.321 imprime como 54.3209
calcular el redondeo término d: 0.5/pow(10,places)
flotador de d = 0,5;
Si (valor < 0)
d * = -1,0;
dividir por diez para cada lugar decimal
para (i = 0; i < lugares; i ++)
d / = 10.0;
Esta pequeña adición, combinada con truncamiento redondeará correctamente nuestros valores
tempfloat += d;
en primer lugar obtener valor decenas para ser la gran potencia de diez menos que el valor
tenscount no es necesario pero sería útil que usted deseó saber después de esto cómo muchos caracteres el número tendrá
Si (valor < 0)
tempfloat * = -1,0;
mientras que ((tens * 10.0) < = tempfloat) {}
decenas * = 10.0;
tenscount += 1;
}
escribir el negativo si es necesario
Si (valor < 0)
Serial.Print('-');
Si (tenscount == 0)
Serial.Print (0, DEC);
para (i = 0; i < tenscount; i ++) {}
Digit = (int) (tempfloat / decenas);
Serial.Print (dígitos, DEC);
tempfloat = tempfloat - (dígitos (float) * decenas);
decenas = 10.0;
}
Si no hay lugares después decimal, ahora pare y
Si (lugares < = 0)
retorno;
de lo contrario, escriba el punto y continuar en
Serial.Print('.');
ahora escribir cada lugar decimal cambio de dígitos uno por uno en el lugar y escribiendo el valor truncado
para (i = 0; i < lugares; i ++) {}
tempfloat * = 10.0;
Digit = (int) tempfloat;
Serial.Print(digit,DEC);
una vez escrito, resta de ese dígito
tempfloat = tempfloat - dígitos (float);
}
}