Ligue um ventilador quando a temperatura estiver muito alta! - Tutorial do Diabinho Elétrico

Luís Duarte
· 7 minutos de leitura
Enviar por e-mail

No nosso último tutorial do Electric Imp , aprendemos como medir a temperatura, a umidade e o conforto térmico geral com Ubidots . Desta vez, vamos criar um controle simples de ventilador liga/desliga. Registraremos a temperatura no Ubidots e acionaremos um evento quando ela ultrapassar 30ºC para que o Electric Imp ligue um ventilador e, em seguida, um gatilho para desligá-lo quando a temperatura estiver abaixo de 27ºC.

Funciona mesmo que maravilhosamente bem, então vamos lá:

Materiais

elétrico

impboard

  • Três fios fêmea-fêmea

fio-femininojpg

  • resistor de 10k

resistor de 10k

  • Sensor de umidade e temperatura DHT11

dh11

-Um pequeno fã

fã

-Uma cauda PowerSwitch

poder

Fiação

É assim que todos os componentes devem ser conectados:

Imprelay temporário

…e só falta uma coisa: ligue o ventilador!

Codificação

  • Faça login no ambiente de desenvolvimento integrado (IDE) do Electric Imp e anote o URL do seu Imp:

Impurl

Copie os dois códigos a seguir. No código do Agente, usaremos uma função para lidar com as solicitações HTTP para o Ubidots. Não se esqueça de inserir o token e o ID das variáveis ​​do seu Ubidots.

  • Código do agente:
device.on("temp", function(value) { //server.log("Tentando enviar o valor para a Ubi:"); //server.log(value); local headers = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Substitua o token pelo seu local url = "ubidots"; // Substitua o ID da variável pelo seu local string = {"value": value}; local request = http.post(url, headers, http.jsonencode(string)); local response = request.sendsync(); }); device.on("hum", function(value) { //server.log("Tentando enviar o valor: hola para a Ubi"); //server.log(value); local headers = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" }; // Substitua o token pelo seu local url = "ubidots"; // Substitua o ID da variável pelo seu local string = {"value": value}; local request = http.post(url, headers, http.jsonencode(string)); local response = request.sendsync(); }); function requestHandler(request, response) { try { // verifica se o usuário enviou led como parâmetro de consulta if ("relay" in request.query) { server.log("entre"); // se sim, e led=1.. define nossa variável como 1 if (request.query.relay == "1" || request.query.relay == "0") { // converte o parâmetro de consulta led para um inteiro local relayState = request.query.relay.tointeger(); // envia a mensagem "led" para o dispositivo e envia ledState como os dados device.send("relay", relayState); } } // envia uma resposta dizendo que tudo estava OK. response.send(200, "OK"); } catch (ex) { response.send(500, "Erro interno do servidor: " + ex); } } // registra o manipulador HTTP http.onrequest(requestHandler);
  • Código do dispositivo:

Observe a última parte do código, onde há uma função para ligar/desligar o ventilador com o fio do Powerswitch.

const SPICLK = 937.5; // Classe para ler o sensor de temperatura/umidade DHT11 // Esses sensores usam um protocolo proprietário de um fio. O imp // emula esse protocolo com SPI. // Para usar: // - conecte MOSI a MISO com um resistor de 10k // - conecte MISO à linha de dados do sensor class DHT11 { static STARTTIME_LOW = 0.001000; // 1 ms de tempo baixo para iniciar static STARTTIME_HIGH = 0.000020; // 20 us min de tempo alto para iniciar static STARTTIME_SENSOR = 0.000080; // 80 us baixo / 80 us alto "ACK" do sensor no START static MARKTIME = 0.000050; // Pulso baixo de 50 us entre as marcas 0 ou 1 static ZERO = 0.000026; // 26 us em nível alto para "0" static ONE = 0.000075; // 70 us em nível alto para "1" spi = null; clkspeed = null; bittime = null; bytetime = null; start_low_bits = null; start_low_bytes = null; start_high_bits = null; start_high_bytes = null; start_ack_bits = null; start_ack_bytes = null; mark_bits = null; mark_bytes = null; zero_bits = null; zero_bytes = null; one_bits = null; one_bytes = null; // construtor da classe // Entrada: // _spi: um periférico SPI pré-configurado (ex: spi257) // _clkspeed: a velocidade na qual o SPI foi configurado para operar // Retorno: (Nenhum) constructor(_spi, _clkspeed) { this.spi = _spi; this.clkspeed = _clkspeed; tempo_de_bit = 1,0 / (velocidade_do_clk * 1000); tempo_de_byte = 8,0 * tempo_de_bit; bits_iniciais_baixos = TEMPO_INICIAL_BAIXO / tempo_de_bit; bytes_iniciais_baixos = (bits_iniciais_baixos / 8); bits_iniciais_altos = TEMPO_INICIAL_ALTO / tempo_de_bit; bytes_iniciais_altos = (bits_iniciais_altos / 8); bits_iniciais_de_reconhecimento = TEMPO_INICIAL_SENSOR / tempo_de_bit; bytes_iniciais_de_reconhecimento = (bits_iniciais_de_reconhecimento / 8); bits_de_marcação = TEMPO_DE_MARCAÇÃO / tempo_de_bit; bytes_de_marcação = (bits_de_marcação / 8); bits_zero = ZERO / tempo_de_bit; bytes_zero = (bits_zero / 8); bits_um = UM / tempo_de_bit; bytes_um = (bits_um / 8); } // função auxiliar // dado um blob longo, encontra os tempos entre transições e os converte em // valores de temperatura e umidade. Assume um valor de retorno de 40 bits (16 para umidade / 16 para temperatura / 8 para checksum) // Entrada: // hexblob (blob de comprimento arbitrário) // Retorno: // tabela contendo: // "rh": umidade relativa (float) // "temp": temperatura em Celsius (float) // se a leitura falhar, rh e temp retornarão 0 function parse(hexblob) { local laststate = 0; local lastbitidx = 0; local gotack = false; local rawidx = 0; local result = blob(5); // Umidade de 2 bytes, temperatura de 2 bytes, checksum de 1 byte local humid = 0; local temp = 0; // itera por cada bit de cada byte do sinal retornado para (local byte = 0; byte < hexblob.len(); byte++) { para (local bit = 7; bit >= 0; bit--) { local thisbit = (hexblob[byte] & (0x01 << bit)) ? 1:0; se (thisbit != laststate) { se (thisbit) { // transição de baixo para alto; observa por quanto tempo fica em nível alto laststate = 1; lastbitidx = (8 * byte) + (7 - bit); } senão { // transição de alto para baixo; laststate = 0; local idx = (8 * byte) + (7 - bit); local hightime = (idx - lastbitidx) * bittime; // agora temos um bit de informação válido. Descobrimos qual símbolo é. local resultbyte = (rawidx / 8); local resultbit = 7 - (rawidx % 8); //server.log(format("bit %d do byte %d",resultbit, resultbyte)); if (hightime < ZERO) { // isto é um zero if (gotack) { // não registre nenhum dado antes do ACK ser visto result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // isto é um um if (gotack) { result[resultbyte] = result[resultbyte] | (0x01 << resultbit); rawidx++; } } else { // isto é um ACK de INÍCIO gotack = true; } } } } } //server.log(format("analisado: 0x %02x%02x %02x%02x %02x",result[0],result[1],result[2],result[3],result[4])); úmido = (resultado[0] * 1.0) + (resultado[1] / 1000.0); se (resultado[2] & 0x80) { // temperatura negativa resultado[2] = ((~resultado[2]) + 1) & 0xff; } temp = (resultado[2] * 1.0) + (resultado[3] / 1000.0); se (((resultado[0] + resultado[1] + resultado[2] + resultado[3]) & 0xff) != resultado[4]) { return {"rh":0,"temp":0}; } senão { return {"rh":úmido,"temp":temp}; } } // ler o sensor // Entrada: (nenhuma) // Retorno: // tabela contendo: // "rh": umidade relativa (float) // "temp": temperatura em Celsius (float) // se a leitura falhar, rh e temp retornarão 0 function read() { local bloblen = start_low_bytes + start_high_bytes + (40 * (mark_bytes + one_bytes)); local startblob = blob(bloblen); for (local i = 0; i < start_low_bytes; i++) { startblob.writen(0x00,'b'); } for (local j = start_low_bytes; j < bloblen; j++) { startblob.writen(0xff,'b'); } //server.log(format("Enviando %d bytes", startblob.len())); local result = spi.writeread(startblob); return parse(result); } } relé <- hardware.pin8; spi <- hardware.spi257; relé.configure(DIGITAL_OUT); função setRelay(relayState){ servidor.log("Estado do relé:" + relayState ); relé.write(relayState); } agente.on("relé", setRelay); função mainLoop(){imp.wakeup(1.0, mainLoop); clkspeed <- spi.configure(MSB_FIRST, SPICLK); dht11 <- DHT11(spi, clkspeed); dados <- dht11.read(); servidor.log(format("Umidade Relativa: %0.1f",dados.rh)+" %"); servidor.log(format("Temperatura: %0.1f C",dados.temp)); agente.send("temp",dados.temp); agente.send("hum",dados.rh); }mainLoop();

Configurar eventos Ubidots

  • Na sua conta Ubidots , crie uma fonte de dados com duas variáveis: Temperatura e Umidade

  • Clique na seção “Eventos” e adicione um:

Etapa 1 do evento

  • Selecione Impedância elétrica como fonte e temperatura (temp) como variável.

Evento_Etapa2

  • Defina uma condição para quando a temperatura estiver acima de 30ºC.

Etapa 3 do evento

  • Selecione “URL da solicitação” e digite seu URL do Imp mais “?relay=1”

Etapa 4 do evento

  • Adicione outro evento com essa condição.

Evento_etapa5

  • Selecione “Solicitar URL” e digite seu URL do Imp mais “?relay=0”

Evento_etapa6

Concluindo

Neste projeto, conseguimos controlar um ventilador elétrico pela internet com o Electric Imp. Assim como controlamos um ventilador usando dados de temperatura, você também pode registrar quaisquer outros dados e tomar ações com base neles. Por exemplo, você pode abrir a porta da garagem sempre que seu gato se aproximar de um sensor de movimento (o que significa que ele quer sair!).

Não se esqueça de conferir algumas das nossas publicações mais recentes:

Se você é novo no Ubidots , confira este ótimo artigo introdutório e inscreva-se gratuitamente hoje mesmo!