Inicialmente, o termostato era feito simplesmente como um termômetro para controlar a temperatura fora da janela. Então, durante as geadas, as batatas começaram a congelar no subsolo e a funcionalidade foi adicionada para controlar o microclima. Dados de passaporte do relé de comutação - 250V e 10A (2,5kW). Como o calor no subsolo não é necessário, dez por quilowatt é suficiente.
Materiais e ferramentas necessários:caixa de sapatos
-USB-cobrando pelo telefone (qualquer, pelo menos 0,7A)
-
Arduino-Pro-Mini
Visor de -2 linhas e 8 caracteres (WH0802A-NGA-CT é mais compacto)
Codificador com um botão (pode ser comprado em qualquer revista de rádio, o botão não pode ser incorporado)
- criança com um relé de 5V (eu comprei vários relés chineses sem isolamento óptico de uma só vez, então precisava de outro Optocoupler PC817 e um resistor de 470 Ohm. Se você tiver isolamento óptico na placa de identificação, poderá conectar a placa de identificação diretamente à porta do arduino)
Conector USB
-2 Cabo de extensão USB de 3 metros (um para o cabo de alimentação e o segundo para soldar o DS1820)
- DS1820 (com qualquer letra)
ferro de solda
pistola de cola
Placa de identificação FTDI232
Etapa 1: Primeiro, precisamos fazer o flash do arduino, porque eu tenho um Pro Mini (ele não precisa de um conversor USB-RS232), preciso soldar uma régua com pinos no arduino. Do lado em que derivam DTR, TXD, RXD, VCC, GND, GND. Agora, conectamos o FTDI232 DTR ao DTR, o VCC ao VCC, o GND ao GND, o TXD ao RXD, o RXD ao TXD. Execute o IDE do arduino, faça o download do esboço e faça o flash (esboço no final).
Etapa 2: Agora vamos cuidar do casco. Arrancamos a esponja no “FUKS”, desengorduramos tudo bem, a parte mais profunda da caixa pode ser passada com um pano de esmeril (algo ficaria mais firmemente preso). Marque o orifício para o codificador, o conector USB (mãe) e o próprio monitor. Cole o relé na tampa da caixa. Devemos tentar colocar o relé mais distante do processador e organizar os componentes para que a tampa feche mais tarde (há muito espaço).
Etapa 3: Agora pegamos o cabo de extensão USB, cortamos o soquete do conector (mãe). Cortamos a ponta cortada, fazemos um orifício para o cabo no corpo, inserimos e cola a chave com uma pistola. Além disso, o cabo tem vermelho, menos preto (basta verificá-lo), mais o sinal de mais, menos o sinal de menos (não dou a pinagem do conector - está na Internet). Entre o sinal de mais do conector e o meio 2 (eu os tenho conectados), um resistor de 4.7kOhm deve ser soldado.
Etapa 4: Pegamos 2 cabos de extensão USB, cortamos o conector (mãe), cortamos o cabo. Por precaução, verificaremos se todos estamos soldados corretamente. Conectamos o cabo de alimentação com o carregamento USB e à rede, prendemos o cabo cortado no conector USB, olhamos o testador + em vermelho - em preto. Retiramos o cabo e soldamos o DS1820: - para 1, + para 3 os 2 fios restantes para 2. Em seguida, revesti o composto epóxi (para reparar os tanques, radiadores), deixando um pouco da caixa do sensor para fora, para que houvesse uma reação mais rápida às mudanças de temperatura.Bem, fazemos a instalação de acordo com o diagrama do circuito (conectamos a potência e o terra da placa de relé aos circuitos + e - comuns, respectivamente).
Etapa 5: Todos os componentes do circuito estão conectados. Conectamos nosso sensor (sem ele, a tela permanecerá preta), aplique energia. Na primeira linha - o valor da temperatura, em 2 se “*” estiver ligado - o relé está ligado, não está desligado. Agora vamos tentar definir os limites de comutação do relé. Pressione o eixo do codificador (ou o seu botão), o valor limite aparece no qual o relé liga girando o eixo - o valor aumenta ou diminui. Ao clicar no eixo novamente - obtemos o limite superior (o relé será desligado), defina o valor e pressione novamente. O dispositivo monitorará a temperatura, o valor dos limites será mantido quando a energia for desligada. Só isso.
#include
#include
#include
#define BUTTON_1_PIN 10 // o número de saída do botão 1 é 12
OneWire ds (12); // no pino 10 (é necessário um resistor de 4,7 K)
// inicializa a biblioteca com os números dos pinos da interface
LCD de cristal líquido (3, 2, 4, 5, 6, 7);
currentTime longo não assinado;
const int pin_A = 8; // pino 12
const int pin_B = 9; // pino 11
char não assinado enc_A;
char não assinado enc_B;
char não assinado enc_A_prev = 0;
float n_pr = 24,1;
float b_pr = 26,2;
preço booleano = false;
botão de classe {
público:
Botão (byte pin, byte timeButton); // descrição do construtor
flagPress booleano; // o botão flag está pressionado
flag booleanoClick; // botão de sinalização foi pressionado (clique)
void scanState (); // método para verificar o estado do sinal
void setPinTime (byte pin, byte timeButton); // método para definir o número de saída e o tempo de confirmação (número)
privado:
byte _buttonCount; // contador de confirmação de estado estável
byte _timeButton; // hora de confirmação do estado do botão
byte _pin; // número do pino
};
Botão button1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (button1.flagClick == false) {
enc_A = leitura digital (pin_A);
enc_B = leitura digital (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
n_pr = n_pr-0,1;
} mais {
n_pr = n_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = false;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
while (button1.flagClick == false) {
enc_A = leitura digital (pin_A);
enc_B = leitura digital (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
b_pr = b_pr-0,1;
} mais {
b_pr = b_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = false;
if (n_pr> b_pr) {
float wr = n_pr;
n_pr = b_pr;
b_pr = wr;
}
int addr = 0;
EEPROM.write (endereço, 'y');
addr = 1;
EEPROM.put (endereço, n_pr);
addr + = sizeof (float);
EEPROM.put (endereço, b_pr);
atraso (300);
}
configuração nula (nula) {
pinMode (11, SAÍDA);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcd.begin (8.2);
int addr = 0;
char c = EEPROM.read (endereço);
endereço = endereço + 1;
if (c == 'y') {
EEPROM.get (endereço, n_pr);
addr + = sizeof (float);
EEPROM.get (endereço, b_pr);
}
// Serial.begin (9600);
}
loop vazio (vazio) {
byte i;
byte presente = 0;
byte type_s;
dados de bytes [12];
byte addr [8];
float celsius;
if (! ds.search (addr)) {
ds.reset_search ();
atraso (250);
retornar
}
if (OneWire :: crc8 (endereço, 7)! = endereço [7]) {
retornar
}
// o primeiro byte da ROM indica qual chip
switch (endereço [0]) {
caso 0x10:
type_s = 1;
quebrar;
caso 0x28:
type_s = 0;
quebrar;
caso 0x22:
type_s = 0;
quebrar;
padrão:
retornar
}
ds.reset ();
ds.select (endereço);
ds.write (0x44, 1); // inicia a conversão, com o parasita ligado no final
enc_A = leitura digital (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// houve um clique no botão
button1.flagClick = false; // redefinir atributo de clique
knopka ();
}
}
// delay (1000); // talvez 750ms seja suficiente, talvez não
// podemos fazer um ds.depower () aqui, mas a redefinição cuidará disso.
presente = ds.reset ();
ds.select (endereço);
ds.write (0xBE); // Ler Scratchpad
para (i = 0; i <9; i ++) {// precisamos de 9 bytes
dados [i] = ds.read ();
}
// Converte os dados para a temperatura real
// porque o resultado é um número inteiro assinado de 16 bits, ele deve
// ser armazenado em um tipo "int16_t", que é sempre 16 bits
// mesmo quando compilado em um processador de 32 bits.
int16_t bruto = (dados [1] << 8) | dados [0];
if (type_s) {
bruto = bruto << 3; // padrão de resolução de 9 bits
if (dados [7] == 0x10) {
// "contagem restante" fornece resolução total de 12 bits
bruto = (bruto & 0xFFF0) + 12 - dados [6];
}
} mais {
byte cfg = (dados [4] & 0x60);
// em baixa resolução, os bits baixos são indefinidos, então vamos zerá-los
if (cfg == 0x00) bruto = bruto & ~ 7; // resolução de 9 bits, 93,75 ms
caso contrário, se (cfg == 0x20) raw = raw & ~ 3; // resolução de 10 bits, 187,5 ms
caso contrário, se (cfg == 0x40) raw = raw & ~ 1; // resolução de 11 bits, 375 ms
//// o padrão é resolução de 12 bits, tempo de conversão de 750 ms
}
celsius = (flutuante) bruto / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
if (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, BAIXO);
priz = false;
}
}
}
// método de verificação do estado do botão
// flagPress = true - clicado
// flagPress = false - pressionado
// flagClick = true - foi clicado (clique)
Botão vazio :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// estado do sinal permanece o mesmo
_buttonCount = 0; // redefine o contador de status do sinal
}
mais {
// estado do sinal mudou
_buttonCount ++; // +1 no contador de estado do sinal
if (_buttonCount> = _timeButton) {
// estado do sinal não mudou o tempo especificado
// estado do sinal tornou-se estável
flagPress =! flagPress; // inverso do indicador de status
_buttonCount = 0; // redefine o contador de status do sinal
if (flagPress == true) flagClick = true; // sinal de clique no clique
}
}
}
// método para definir o número de saída e o tempo de confirmação
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = pino;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // define a saída como entrada
}
// descrição do construtor da classe Button
Button :: Button (pino de byte, timeButton de byte) {
_pin = pino;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // define a saída como entrada
}