Ligue um ventilador quando a temperatura estiver muito alta! - Tutorial de Imp elétrico

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

Realmente funciona perfeitamente, então vamos lá:

Materiais

  • Três fios fêmea para fêmea

  • resistor de 10k

  • Sensor de umidade e temperatura DHT11

-Um pequeno fã

-Uma cauda PowerSwitch

Fiação

É assim que todos os componentes devem ser conectados:

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

Codificação

  • Faça login no IDE Electric Imp e anote a URL do seu Imp:

Copie os próximos dois códigos. No código do Agente, usaremos uma função para lidar com solicitações HTTP para Ubidots , não esqueça de colocar o token e o id das variáveis ​​do seu Ubidots .

  • Código do Agente:
device.on("temp", function(value) { //server.log("Tentando postar o valor no Ubi:"); //server.log(value); local headers = { "Content-Type": "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" } // Substitua o token pelo seu local url = "http: ubidots .com/api/v1.6/variables/53d2beb37 625424630223dac/ valores"; // 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 postar para Ubi o valor:hola"); //server.log(value); local headers = { "Content-Type" : "application/json", "X-Auth-Token": "NBbF3PWPxWc2IaO40aXOKnhIu8tOv92rYN3ibiEc7Jh6GV3KZUUCHtXuNz7Y" } // Substitua o token pelo seu local url = "http: ubidots .com/api/v1.6/variables/53e541 e57625422c7d900a1d /values"; // 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" em request.query) { server.log("entre"); // se sim, e led=1.. defina nossa variável como 1 if (request.query.relay == "1" || request.query.relay == "0") { // converta 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 dados device.send("relay", relayState); } } // envia uma resposta dizendo que estava tudo bem. resposta.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 a cauda do Powerswitch.

const SPICLK = 937,5; // Classe para leitura do sensor de temperatura/umidade DHT11 // Esses sensores utilizam um protocolo proprietário de um fio. O imp // emula este protocolo com SPI. // Para usar: // - vincular o MOSI ao MISO com um resistor de 10k // - vincular o MISO à linha de dados no sensor class DHT11 { static STARTTIME_LOW = 0.001000; // Tempo mínimo de 1 ms para início static STARTTIME_HIGH = 0.000020; // 20 us min de tempo máximo para início static STARTTIME_SENSOR = 0.000080; // 80 us baixo / 80 us alto "ACK" do sensor em START static MARKTIME = 0.000050; // 50 us pulso baixo entre marcas 0 ou 1 static ZERO = 0.000026; // 26 us de altura para "0" static ONE = 0.000075; // 70 us de altura para "1" spi = null; clkspeed = null; bittime = nulo; bytetime = nulo; start_low_bits=nulo; start_low_bytes=nulo; start_high_bits=nulo; start_high_bytes=nulo; start_ack_bits=nulo; start_ack_bytes=nulo; marca_bits = nulo; mark_bytes = nulo; zero_bits = nulo; zero_bytes = nulo; um_bits = nulo; um_bytes = nulo; // construtor de classe // Entrada: // _spi: um periférico SPI pré-configurado (por exemplo, spi257) // _clkspeed: a velocidade em que o SPI foi configurado para rodar // Return: (None) constructor(_spi, _clkspeed) { isto.spi = _spi; this.clkspeed = _clkspeed; bittime = 1,0 / (clkspeed * 1000); bytetime = 8,0 * bittime; start_low_bits = STARTTIME_LOW / bittime; start_low_bytes=(start_low_bits/8); start_high_bits=STARTTIME_HIGH/bittime; start_high_bytes=(start_high_bits/8); start_ack_bits=STARTTIME_SENSOR/bittime; start_ack_bytes=(start_ack_bits/8); mark_bits=MARKTIME/bittime; marca_bytes=(marca_bits/8); zero_bits = ZERO/bittime; zero_bytes = (zero_bits/8); one_bits = UM/bittime; um_bytes = (um_bits/8); } // função auxiliar // dado um blob longo, encontre os tempos entre as transições e analise // os valores de temperatura e umidade. Assume valor de retorno de 40 bits (16 umidade / 16 temp / 8 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; lastbitidx local = 0; ataque local = falso; rawidx local = 0; resultado local = blob(5); // Umidade de 2 bytes, temperatura de 2 bytes, soma de verificação de 1 byte umidade local = 0; temperatura local = 0; // itera através de cada bit de cada byte do sinal retornado for (local byte = 0; byte < hexblob.len(); byte++) { for (local bit = 7; bit >= 0; bit--) { local thisbit = (hexblob[byte] & (0x01 << bit)) ? 1:0; if (thisbit! = laststate) { if (thisbit) { // transição de baixo para alto; observe para ver quanto tempo fica alto laststate = 1; últimobitidx = (8 * byte) + (7 - bits); } else { // transição de alto para baixo; último estado = 0; idx local = (8 * bytes) + (7 - bits); hora alta local = (idx - lastbitidx) * hora de bit; // agora temos uma informação válida. Descubra que símbolo é esse. byte de resultado local = (rawidx / 8); bit de resultado local = 7 - (rawidx% 8); //server.log(format("bit %d do byte %d",resultbit, resultbyte)); if (hightime <ZERO) { // este é um zero if (gotack) { // não registre nenhum dado antes que o ACK seja visto result[resultbyte] = result[resultbyte] & ~(0x01 << resultbit); rawidx++; } } else if (hightime < ONE) { // este é um if (gotack) { resultado[resultbyte] = resultado[resultbyte] | (0x01 << bit de resultado); rawidx++; } } else { // este é um START ACK gotack = true; } } } } } //server.log(format("analisado: 0x %02x%02x %02x%02x %02x",resultado[0],resultado[1],resultado[2],resultado[3],resultado [4])); úmido = (resultado[0] * 1,0) + (resultado[1] / 1000,0); if (resultado[2] & 0x80) { // resultado de temperatura negativa[2] = ((~resultado[2]) + 1) & 0xff; } temp = (resultado[2] * 1,0) + (resultado[3] / 1000,0); if (((resultado[0] + resultado[1] + resultado[2] + resultado[3]) & 0xff) != resultado[4]) { return {"rh":0,"temp":0}; } else { return {"rh":humid,"temp":temp}; } } // lê o sensor // Entrada: (nenhum) // Retorno: // tabela contendo: // "rh": umidade relativa (float) // "temp": temperatura em Celsius (float) // se lido 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())); resultado local = spi.writeread(startblob); retornar análise(resultado); } } relé <- hardware.pin8; spi <-hardware.spi257; rele.configure(DIGITAL_OUT); função setRelay(relayState){ server.log("relayState:" + 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(); server.log(format("Umidade Relativa: %0.1f",data.rh)+" %"); server.log(format("Temperatura: %0.1f C",data.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:

  • Escolha Electric imp como fonte e temperatura (temp) como variável.

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

  • Escolha URL de solicitação ”e digite seu URL Imp mais “?relay=1”

  • Adicione outro evento com esta condicional.

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

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 realizar 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 de nossas últimas postagens:

Se você é novo no Ubidots , confira esta excelente peça inicial e inscreva-se gratuitamente hoje mesmo!