Resultados da busca - %E6%81%92%E8%BE%BE%E7%99%BB%E5%BD%95%E7%94%A8%E6%88%B7%E5%90%8D%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%E3%80%90%E2%94%83%E5%A5%BD%E8%AE%A1%E5%88%922%E2%92%8F7%E2%92%8F01705%7B%EF%BC%B1%E3%80%91%E3%80%91
ntrados na internet consegui bastante coisa..más vamos a duvida..tenho as seguintes situações..
Segue abaixo o que aparece nos display 16x2
Monitoramento (0,0)
00:00:00 (1,0)I
Temperatura (0,0)
28º C (1,0)
I
Acionamento (0,0)
Liga - -(ou desliga) (0,1)
Do jeito acima já funciona, más queria uma configuração diferente, igual ao esquema abaixo;
Tela - botão do lado iria para o tempo, botão do lado - temperatura - botão do lado - luninosidade
monitoramento -> Tempo 00:00:00 -> Temperatura 28ºC -> Luninosidade 600.
Agora, botão abaixo
Acionamento - Liga/Desliga
Acredito que seja isso..se aluem puder dá uma mão agradeceria.
Segue o codigo que já fiz.
#include <LiquidCrystal.h> #include <Limits.h>
const int temperatura = 0; int contador=0; const int BtAcima = 3; const int BtAbaixo = 6; const int BtDireito = 4; const int BtEsquerdo = 5; boolean troca = false ; boolean troca1 = false ; boolean troca2 = false ; boolean troca3 = false; const int sensorTemp = 0; int valorSensorTemp = 0; int menorValorTemp = INT_MAX; int seg=0,min=0,hor=0;
//inicia o display e seleciona as entradas e saidas LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() { lcd.begin(16, 2); lcd.print("ATIVANDO... "); lcd.setCursor(0, 1); lcd.print("PAINEL SOLAR"); delay(5000); lcd.setCursor(0, 1); lcd.print(" "); lcd.clear(); lcd.setCursor(0, 0); lcd.print("MONITORAMENTO."); pinMode(BtAcima, INPUT); pinMode(BtAbaixo, INPUT); pinMode(BtDireito, INPUT); pinMode(BtEsquerdo, INPUT); pinMode(A5, OUTPUT); pinMode(A4, OUTPUT); pinMode(A3, OUTPUT); pinMode(A2,OUTPUT); }
void loop() {
int estado =0; int estado2 =0; int estado3 =0; int estado4 =0; //faz a leitura do estado dos botoes estado = digitalRead(BtAcima); estado2 = digitalRead(BtAbaixo); estado3 = digitalRead(BtDireito); estado4 = digitalRead(BtEsquerdo); //controle da sequencia do menu if (estado == HIGH) { delay(250); contador=contador+1; } if (estado2 == HIGH) { delay(250); contador=contador-1; } if (contador<0){ contador=3; }
static unsigned long ult_tempo = 0; int tempo = millis(); if(tempo - ult_tempo >= 1000) { ult_tempo = tempo; seg++; } if(seg>=60) { seg = 0; min++; }
if(min>=60) { min = 0; hor++; } if(hor>=24) { hor=0; min=0; } //menu switch(contador){ case 0: if (estado3 == HIGH & troca==false ){ delay(150); troca=true; }else { delay(150); if(troca==true & estado3==HIGH){ troca=false; } }
lcd.setCursor(0, 0); lcd.print("MONITORAMENTO"); lcd.setCursor(0,1); lcd.print("TF: "); lcd.print(hor); lcd.print(":"); lcd.print(min); lcd.print(":"); lcd.print(seg); lcd.print(" "); delay(1000); break;
case 1: if (estado3 == HIGH & troca1==false ){ delay(150); troca1=true; }else{ delay(150); if(troca1==true & estado3==HIGH){ troca1=false; } } menorValorTemp = INT_MAX; //Inicializando com o maior valor int possível for (int i = 1; i <= 8; i++) { //Lendo o valor do sensor de temperatura. valorSensorTemp = analogRead(sensorTemp); //Transformando valor lido no sensor de temperatura em graus celsius aproximados. valorSensorTemp *= 0.54 ; //Mantendo sempre a menor temperatura lida if (valorSensorTemp < menorValorTemp) { menorValorTemp = valorSensorTemp; } delay(150); } lcd.clear(); //limpa o display do LCD. lcd.print("Temp: "); //imprime a string no display do LCD. lcd.print(menorValorTemp); lcd.write(B11011111); //Simbolo de graus celsius lcd.print("C"); break; case 2: if (estado3 == HIGH & troca2==false ){ delay(150); troca2=true; }else{ delay(150); if(troca2==true & estado3==HIGH){ troca2=false; } }
lcd.setCursor(0, 0); lcd.print("CONTROLE "); lcd.setCursor(0,1); if (troca2==1){ lcd.print("ATIVADO "); digitalWrite(A5,HIGH); }else{ lcd.print("DESATIVADO "); digitalWrite(A5,LOW); } break;
case 3: if (estado4 == HIGH & troca3==false ){ delay(150); troca3=true; }else{ delay(150); if(troca3==true & estado4==HIGH){ troca3=false; } }
lcd.setCursor(0, 0); lcd.print("DEMANDA "); lcd.setCursor(0,1); if (troca3==1){ lcd.print("LIGADO "); digitalWrite(A2,HIGH); } // if (troca3==1{ else{
lcd.print("DESLIGADO "); digitalWrite(A2,LOW); } break;
default: contador=0; }
}
…
ude <Keypad.h>#include <LiquidCrystal.h> const byte Coluna = 3;const byte Linha = 4; int i=0;char Teclas[Linha][Coluna] = {{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}};byte Pino_linha[Linha] = {6, 12, 13, 9};byte Pino_coluna[Coluna] = {8, 7, 10}; LiquidCrystal lcd(1, 11, 5, 4, 3, 2);Keypad keypad = Keypad(makeKeymap(Teclas), Pino_linha, Pino_coluna, Linha, Coluna ); #define bombaUm A5 // pino que aciona a bomba1 e a válvula1 #define botaoliga A3 // Pino para botão de Ligar o sistema #define EPO A4 // Botaão para Emergencia ESP #define botao_prgm1 A0 // Pino para botão de carga do protudo 1 #define hallsensor1 0 // The pin location of the sensor float Calc1 = 0; // Variavel para contagem de pulsos do sensor1 de fluxo
unsigned int debounceDelay = 5; // Tempo de debounce unsigned int Flagbotaoliga; // Variavel para indicar se o botão de liga foi acionado unsigned int FlagEPO; // Variavel para indicar se o botão de emergencia foi acionado
void setup(){ {
lcd.begin(16, 2); pinMode(hallsensor1, INPUT_PULLUP); // Initializes digital pin 2 as an input pinMode (bombaUm, OUTPUT); // pino que aciona a bomba1 e a válvula1 como saida pinMode (botao_prgm1, INPUT_PULLUP); // pino do botão de carga de 900ml1 como entrada e PULL_UP pinMode (botaoliga, INPUT_PULLUP); // pino do botão de liga como entrada e PULL_UP pinMode (EPO, INPUT_PULLUP); // pino do botão de Emergencia como entrada e PULL_UP Flagbotaoliga = 0; // Indicador de botaão de liga, como desligado digitalWrite (bombaUm, HIGH);
} void loop(){ char teclaPressionada = keypad.getKey(); if (teclaPressionada != NO_KEY)} { lcd.setCursor(i, 0); lcd.print(teclaPressionada); i++; }}
// ================= botaoliga deboucing ==================={ {if(!digitalRead(botaoliga)) // Se botão de ligar está pressionado delay(debounceDelay); // delay para evitar bounce(ruído eletrico) if(!digitalRead(botaoliga)) // Se botão de ligar está pressionado Flagbotaoliga = 1; // Indicador de botão de liga, como ligado FlagEPO = 0; // Indicativo de emergencia desligado lcd.setCursor(9,0); // Posiciona cursor na 9a. posição da 2a linha lcd.print ("Ligado "); // Informa sistema ligado lcd.setCursor(0,1); // Posiciona cursor na 10a. posição da 2a linha lcd.print (" "); // Limpa a área while(!digitalRead(botaoliga)) // Espera pela liberação do switch delayMicroseconds(1); // delay de 1u segundos } if(!digitalRead(EPO)) // Se botão de ligar está pressionado { // Faça delay(debounceDelay); // delay para evitar bounce(ruído eletrico) if(!digitalRead(EPO)) // Se botão de emergencia está pressionado { FlagEPO = 1; // Indicativo de emergencia ligado digitalWrite (bombaUm,HIGH); // Desliga bomba 1 e Valvula 1 Flagbotaoliga = 0; // Indicador de botão de liga, como desligado lcd.setCursor(9,0); // Posiciona cursor na 10a. posição da 2a linha lcd.print ("Deslig. "); // Informa sistema desligado lcd.setCursor(0,1); // Posiciona cursor na 1a. posição da 2a linha lcd.print (""); // Limpa a área while(!digitalRead(EPO)) // Espera pela liberação do switch delayMicroseconds(1); // delay de 1u segundos } if (Flagbotaoliga == 1) // Se o botão de liga foi acionado { // Faça if ((Flagbotaoprgm2 == 0) & (Flagbotaoprgm3 == 0)) // Se não está usando prgm2 ou prgm3 { // Faça if(!digitalRead(botao_prgm1)) // Se o botão de carga de 500ml1 está pressionado { if (Calc1 < 356 * teclaPressionada ) // Se a quantidade envasada for menor que 900ml { // Faça Flagbotaoprgm1 = 1; // Indicador de botão de progm1, como ligado digitalWrite (bombaUm,LOW); // Liga bomba 1 e Valvula 1 if(pulseIn(hallsensor1, LOW)) // Se pulso do sensor1 de fluxo for low Calc1++; // Incremente contador de quantidade lcd.setCursor(0,2); lcd.print(Calc1); lcd.setCursor(10,1); lcd.print(Calc1*3.0303); } else // Se a quantidade envasada for maior que 500ml { // Faça Flagbotaoliga = 0; // Indicador de botão de liga, como desligado digitalWrite (bombaUm,HIGH); lcd.setCursor(10,1); // Posiciona cursor na 10a. posição da 2a linha lcd.print (Calc1*3.0303); // Mostra contador lcd.setCursor(9,0); // Posiciona cursor na 9a. posição da 2a linha lcd.print ("Deslig."); // Informa sistema desligado Calc1 = 0; // Zera variavel contadora Flagbotaoprgm1 = 0; // Indicador de botão de progm1, como desligado } } else // Se o botão de carga de 500ml1 não está pressionado { if (Flagbotaoprgm1 == 1) // Se indicador de botão de progm1 estiver ligado { // Faça digitalWrite (bombaUm,HIGH); // Desliga bomba 1 e Valvula 1 lcd.setCursor(10,1); // Posiciona cursor na 10a. posição da 2a linha lcd.print (Calc1*3.0303); // Mostra contador } } } } }
…
Adicionado por Lucas Feil ao 21:42 em 22 março 2016
receber dados de sensores do ROV que terá um Arduíno MEGA. A comunicação será através da porta serial e é com essa comunicação que estou tendo dificuldades.
Até o momento consegui fazer o controle de apenas um motor e não estou conseguindo controlar os demais. Um amigo que tem um conhecimento básico me disse que poderia fazer usando um array, assim escrevi a programação do transmissor mas não consegui nada além disso.
Se alguém puder me ajudar com esse problema, agradeço desde já.
Abaixo está a programação do transmissor e do receptor, respectivamente e em terceiro a provável programação de um array do transmissor.
--------------------------------------------------------------------------------
// transmissor int joystick_1_y; void setup() { Serial.begin(19200); // habilita comunicção serial } void loop() { // leitura joystick movimentação frente/trás joystick_1_y = (analogRead(A0) / 4); // lê o pino analógico A0 e mapeia os valores para 0 - 255 Serial.write(joystick_1_y); // envia o valor via serial em modo binário } -------------------------------------------------------------------------------- // receptor int mov_frontal = 2; int mov_reverso = 3; int j_1 = 0; int val_1; byte inc_1; void setup() { Serial.begin(19200); // habilita comunicação serial pinMode(mov_frontal, OUTPUT); // declara o pino 2 como saída pinMode(mov_reverso, OUTPUT); // declara o pino 3 como saída Serial.flush(); // limpa o buffer } void loop() { if(Serial.available()) { // se há bits vindo da porta serial inc_1 = Serial.read(); // seta o valor para a variável val_1 val_1 = map(inc_1, 0, 255, 0, 1023); j_1 = val_1 - 512; j_1 = abs(j_1); } if(j_1 >= 510) { j_1 = 510; } if(j_1 <= 200 && j_1 > 20) { j_1 = 200; } if(j_1 <= 20) { j_1 = 0; } if(val_1 > 500) { analogWrite(mov_frontal, j_1/6); analogWrite(mov_reverso, j_1/2); } if(val_1 < 500) { analogWrite(mov_frontal, j_1/2); analogWrite(mov_reverso, j_1/6); } if(val_1 <= 520 && val_1 >= 510) { analogWrite(mov_frontal, 0); } } -------------------------------------------------------------------------------- // transmissor com Array int joystick_1_y; int joystick_1_x; int myArray[2]; unsigned int frente_tras; unsigned int rotacao; void setup() { Serial.begin(19200); // habilita comunicção serial } void loop() { joy_1_y(); myArray[0] = frente_tras; joy_1_x(); myArray[1] = rotacao; for(unsigned int i = 0; i < 1; i++) { Serial.write(myArray[i]); } }
int joy_1_y() { // leitura joystick movimentação frente/trás joystick_1_y = (analogRead(A0) / 4); // lê o pino analógico A0 e mapeia os valores para 0 - 255 Serial.write(joystick_1_y); // envia o valor via serial em modo binário } int joy_1_x() { // brilho da luz joystick_1_x = (analogRead(A1)) / 4; // lê o pino analógico A1 e mapeia os valores para 0 - 255 Serial.println(joystick_1_x); // envia o valor via serial em modo binário }…
Adicionado por Husney Maciel ao 7:04 em 27 julho 2015
que estou usando como resistência, mas logo os valores chegam no ajuste, desligando e ligando o rele a cada segundo. Tentei de tudo para deixar uma margem de 3 graus e 3% na umidade para que o arduino desligue a lampada e volte a ligar somente quando houver esta diferença. Se alguém puder me ajudar agradeço.
Segue o código:
#include <LiquidCrystal.h>#include "DHT.h"
int sensor = 0; // Pino analogico em que o sensor esta conetado A0 - Colocar resistor 10Kint valorSensor = 0; //variável usada para ler o valor do sensor em tempo real.int backlite; // variavel do backliteint luzBacklite = 10; // Luz de fundo do LCD ligado a porta digital 10int rele1 = 7; // Rele resistencia 10W ligado a porta digital 7int tempo = 0, segundo, segundos = 00, minutos = 00, horas = 00, dias = 0;
const int numRows = 2; // these constants won't change. But you can change the size ofconst int numCols = 16; // your LCD using them:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins
byte temp[8] = { 0b00100, // vetor de bytes correspondentes0b01010, // ao desenho de temperatura0b01010,0b01110,0b01110,0b11111,0b11111,0b01110};
byte grau[8] = { 0b01000, // vetor de bytes correspondentes0b10100, // ao simbolo de graus0b01000,0b00000,0b00000,0b00000,0b00000,0b00000};
byte clock[8] = { 0b00000, // vetor de bytes correspondentes0b01110, // ao simbolo de graus0b10101,0b10101,0b10111,0b10001,0b01110,0b00000};
byte umid[8] = { 0b10101, // vetor de bytes correspondentes0b01010, // ao simbolo de umidade0b00000,0b01110,0b11111,0b00100,0b10100,0b01000};
#define DHTPIN 8 // what pin we're connected to
// Uncomment whatever type you're using!//#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302)//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V// Connect pin 2 of the sensor to whatever your DHTPIN is// Connect pin 4 (on the right) of the sensor to GROUND// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() { Serial.begin(9600); pinMode(luzBacklite,OUTPUT); pinMode(rele1,OUTPUT); digitalWrite(luzBacklite, HIGH); lcd.begin(numCols,numRows); // set up the LCD's number of columns and rows: lcd.setCursor(0,0); lcd.print("Controle Umidade"); delay(2000);
lcd.createChar(1, temp); // envia caracter "temp" para o display lcd.createChar(2, grau); // envia caracter "grau" para o display lcd.createChar(3, umid); // envia caracter "umidade" para o display lcd.createChar(4, clock); // envia caracter "relogio" para o display dht.begin();}
void loop() { valorSensor = analogRead(sensor); //Lendo o valor do sensor. //valorSensor = 1023 - valorSensor; backlite = map(valorSensor, 0, 1023, 1, 255); analogWrite(luzBacklite, backlite); // acende o backlite com o brilho determinado segundo = millis() /1000;
float h = dht.readHumidity(); // Reading temperature or humidity takes about 250 milliseconds! float t = dht.readTemperature(); // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) if (segundo > tempo || segundo < tempo) { tempo = segundo; segundos = segundos + 1; } if (segundos >= 60) { minutos = minutos + 1; segundos = 0; } if (minutos >= 60) { horas = horas + 1; minutos = 0; } if (horas >= 24) { dias = dias + 1; horas = 0; } if (isnan(t) || isnan(h)) { // check if returns are valid, if they are NaN (not a number) then something went wrong! lcd.setCursor(0,0); // Posiciona cursor na linha 0,0 lcd.print("Falha ao ler DHT"); // Imprime mensagem de erro } else { lcd.clear(); lcd.setCursor(0,0); // Posiciona cursor na linha 0,0 lcd.write(3); // Desenha caracter "umid" lcd.setCursor(2,0); lcd.print(h, 1); // Valor da umidade lcd.print("%"); // Simbolo lcd.print(" "); // Espaco lcd.write(1); // Desenha caracter "temp" lcd.print(" "); // Espaco lcd.setCursor(10,0); lcd.print(t, 1); // Valor de temperatura lcd.write(2); // Desenha caracter "grau" lcd.print("C"); // Letra C lcd.setCursor(0,1); if(dias < 100) { Serial.print("0"); lcd.print("0"); } if(dias < 99 || dias > 10) { Serial.print("0"); lcd.print("0"); } lcd.print(dias); Serial.println(); Serial.print(dias); lcd.setCursor(5,1); lcd.write(4); //Desenha relogio Serial.print(" "); lcd.setCursor(8,1); if(horas < 10) { Serial.print("0"); lcd.print("0"); } Serial.print(horas); lcd.print(horas); Serial.print(":"); lcd.print(":"); if(minutos < 10) { Serial.print("0"); lcd.print("0"); } Serial.print(minutos); lcd.print(minutos); Serial.print(":"); lcd.print(":"); if(segundos < 10) { Serial.print("0"); lcd.print("0"); } Serial.print(segundos); lcd.print(segundos); // delay(1); // Atraso para ler dados novamente } if((h>20) && (t<45)) { // variavel que representa se a umidade for maior que 20 e a temperatura for menor que 45 digitalWrite(7,HIGH); // Liga rele da porta digital 7 } else { // variavel que indentifica se o valor acima e verdadeiro pois se for falso executa: digitalWrite(7,LOW); } // Desliga rele da porta digital 7}…
Adicionado por Denis Alveia ao 6:07 em 28 maio 2013
qual era seu problema, por dois motivos: 1) estes problemas são algo comum de ocorrer, quando não se utiliza a abordagem adequada, e portanto são bem conhecidos, fazendo com que eu já imagine o que está ocorrendo; 2) neste momento, estou tentando ter uma visualização melhor do panorama do seu Sistema, quais recursos e elementos existem nele, como eles interagem entre si, e como este Sistema deve se comportar.
Logo, o objetivo neste momento é elucidar o seu Sistema, clarificando alguns aspectos do funcionamento dele, e relacionar comportamentos e efeitos colaterais, em abordagens e cuidados mais comuns que se deve tomar em elementos individuais. Posteriormente, podemos abordar diretamente as tratativas, de forma que sejam incisivas e com muito alta confiabilidade.
Iniciando com suas informações preliminares, podemos fazer um Diagrama em Blocos do seu Sistema, ainda assim com algum caráter genérico, pois não estou fixando a quantidade de PCFs:
(clique na figura para "zoom")
Observe que apesar do Barramento I2C poder ter velocidade de 400 KHz, marquei como sendo de 100 Khz, pois você está conectando apenas os PCF8574, os quais tem a limitação de até 100 Khz no I2C (conforme datasheet).
Sobre o ESP-01, marquei como rodando a 80MHz (mais usado), já que vc não disse a velocidade (80 ou 160 MHz).
Sobre a configuração de I/Os dos PCFs, está um tanto genérica (apenas saídas, apenas entradas, e um "mix" de saídas/entradas em um mesmo PCF). O total de PCFs neste Sistema, é "n".
Finalmente, como provavelmente você estará acionando (On/Off) dispositivos ligados às saídas digitais, e provavelmente lendo status ("On/Off" ou "1/0") via entradas digitais, então marquei desta forma no diagrama.
Então, vamos comentar cada um dos itens que enumerei no post anterior, de acordo com as informações que vc forneceu, e acrescentando um panorama sobre cada um:
1) você informou estar usando neste momento apenas um PCF, mas que acabará por ter quatro (e talvez até mais, já que especificações de Projeto podem mudar mesmo durante o andamento das coisas). Bem, isto é o primeiro e principal indicativo de que vc tem de fato uma encrenca, pois um controle adequado deste único PCF no Sistema, não deveria de forma alguma resultar em problema.
O PCF8574 vai até 100KHz (no I2C). Você pode até aumentar esta velocidade (apenas via código), e provavelmente funcionará (talvez até uns 200KHz, ou até mais), porém estará indo contra o especificado no Datasheet do PCF8574 o que seria um dos primeiros passos para o "dark side".
Para análise, vamos considerar as transações mais simples do I2C, onde em um ciclo com um dispositivo, ou é enviado um Byte, ou é lido um Byte deste dispositivo. Isto pode ser bem observado na Especificação I2C (ver neste link da NXP: I2C Bus Specification), conforme mostrado na figura a seguir:
Veja que para a transmissão mais simples do "Master" (Arduino) para o "Device" (neste caso o PCF, no I2C chamado de "Slave"), ou seja para enviar apenas um Byte ao "Device", teríamos 20 bits (faça a contagem na figura anterior: "Fig 11"). Façamos o cálculo de quanto tempo leva isso no I2C@100KHz: tempo de envio = 20/100000 = 200 us (duzentos micro segundos, ou 0.2 mili segundos).
Na direção contrária, ou seja para ler um Byte do "Device", confira (na "Fig 12") e veja que são os mesmos 20 bits. Logo também gasta-se 200us, ou 0.2 ms.
Observe que estas transações são cerca de 1500 vezes mais lentas que um I/O convencional no Arduino UNO (instruções "OUT" e "IN" do AVR@16MHz), e cerca de 250 vezes mais lentas que uma transação SPI (SCLK@10MHz). Tendo estas comparações em mente, permite-se avaliar abordagens das soluções e seus resultados preliminares.
Se essas transações estivessem sendo gerenciadas por DMA, não haveria muito que se preocupar com estes tempos. Mas Raphael, não é o caso no seu Sistema (o UNO não tem DMA). No seu Sistema, a forma como funciona a "Wire" força o código a acompanhar bem de perto a transação I2C que ocorre no Hardware, o que tem um impacto direto na performance de execução do código. Se vc abrir a "wire.c" e "twi.c", vai ficar espantado com toda a tratativa burocrática que é feita para fazer a cadência de controle do I2C. Claro, isto tem seus motivos (filosofia), mas não vou entrar nesta questão.
Eu ainda não medi o impacto sobre a execução do código no UNO, que essa burocracia toda do I2C tem. Mas quando tiver algum tempo irei medir, a fim de ter dados mais precisos sobre isto. Independente disso, dando uma rápida olhada no código interno das Libs "wire.c" e "twi.c" (isso sem contar a Lib dos próprios dispositivos, como por exemplo um RTC que usa I2C), sabemos que não podemos esperar nenhum código executando como um "foguete" no UNO (que já não é "rápido" por natureza).
Para cada PCF que vc utiliza, uma transação ocorre para atualizar as saídas ou para ler entradas. Se um PCF tem um "mix" de entradas e saídas, então para cada PCF assim, pode-se dizer que ocorrerá no mínimo duas transações (uma para ler, outra para escrever). Então, aqui já temos um ponto para abordar na tratativa, onde considera-se também o gerenciamento da taxa de atualização dos PCFs (o que já deu pra perceber, tem tudo a ver).
2) Você disse estar usando 9600 bps entre Arduino e ESP. Não é porque seu Sistema trabalha e controla "elementos" lentos (como Motores, Relés, Chaves, etc), que seu Sistema deve ser "taxado" para baixo em termos de velocidade de comunicação. A taxa de 9600 é considerada uma das mais baixas. Será ela adequada neste caso? Isto depende do que mais há no seu Sistema, e do impacto que estas "outras coisas" tem na execução do seu código.
Nessa velocidade de 9600, um Byte será transmitido ou recebido em cerca de 1ms (faça a s contas: [1 start bit + 8 bits dados + 1 stop bit]/9600 = 10/9600 = ~1ms) . Parece rápido, principalmente porque o Hardware da UART do Atmega328 (assim como no ESP) gerencia o streaming de bits na transmissão/recepção (claro, no I2C também é assim). Porém, vc não pode esquecer que assim como ocorria no I2C, também há uma burocracia associada à Serial, e ela não deve ser ignorada (esse é um erro quase fatal, dependendo das suas necessidades de transferência de dados e do Protocolo usado).
Para mostrar parte desta "burocracia", sem entrar em análise de código em Libs, vamos dar uma olhada na função "Main.c" do Arduino, que é a "mãezona" que cadencia a execução de seu código no Arduino. Lá esperamos encontrar um código de inicialização, um código em loop infinito, e algumas coisinhas mais. Vejamos:
Vemos que há algumas funções de inicialização ("init", "initVariant", etc), uma das quais é o "setup" do Arduino que conhecemos bem. Depois disso, o código do Arduino entra no "for(;;)", que é um loop infinito. Dentro desse "for", encontramos o famoso "loop" do Arduino, que o mundo Ocidental e Oriental adora como se ele fosse um Faraó do Egito ou Deus Asteca.
Uma vez dentro da função "loop", temos "total" controle (pelo menos é o que todo mundo pensa, né?). Mas note, o que ocorre depois que se encerra um ciclo de execução da função "loop": há um "if", onde o código no Arduino vai dar tratamento para eventos da Serial ("serialEventRun"). Isto é apenas parte da burocracia que mencionei sobre a Serial. E vc não tem como evitá-la: ela vai consumir clocks de execução do seu Processador. Pode parecer que isto é um prelúdio do fim pras nossas esperanças. Mas não é.
Sabendo adequar de forma favorável a temporização do seu Sistema, e tendo uma taxa de bits também adequada (Serial), você pode garantir um funcionamento "suave", sem trancos e barrancos. Neste caso específico da Serial, é quase imprescindível que o Protocolo entre Arduino e ESP tenha sido implementado de forma adequada. Do contrário...
3) como vc informou que a "massa de dados" entre Arduino e ESP é mínima e esporádica, isso é uma enorme boa notícia para vc, pois implica que é relativamente muito tranquilo e fácil de se fazer a temporização adequada que mencionei acima (item "2"), de forma a garantir o funcionamento "suave" sem trancos e barrancos no seu Sistema. Se no entanto a "massa de dados" fosse centenas de bytes por transação, aí a coisa mudaria de figura, mas não é este o seu caso.
A questão de haver comunicação esporádica, acrescenta ao seu Sistema, um elemento que chamamos tecnicamente de "Evento Assíncrono", o que significa que durante o funcionamento do seu Sistema e respectiva temporização, ele deve ser capaz de tratar qualquer evento relacionado à comunicação entre o Arduino e ESP, independente do momento em que isto ocorra, e de forma eficiente, pois do contrário poderá prejudicar qualquer outra tarefa que esteja sendo executada no momento em que o evento assíncrono ocorre, comprometendo a confiabilidade do funcionamento.
Para isto, muitas vezes é preciso não somente olhar com cuidado as tarefas de gerenciamento da comunicação, mas também olhar com mais atenção ainda, as demais tarefas sendo executadas, e analisar qual seria o impacto se uma destas tarefas fosse "interrompida" por um evento assíncrono, ou analisar se o gerenciamento necessário para tratar esse evento pode aguardar até que a tarefa seja concluída (ou pelo menos a parte "crítica" dela).
Neste ponto, vai aparecer muita gente aqui (e por aí afora) dizendo pra vc: "ah, usa logo um RTOS que resolve seu problema". Já vi muita coisa semelhante sendo dita. De fato, é quase certo que o uso de um RTOS ajuda muito nisso. Mas é o que vc procura? ou será que vc quer não somente ver seu Sistema funcionando, mas também ter o prazer de dominar as técnicas adequadas e poder sentir que aquilo tudo está nas suas mãos. Aí é com vc, né Raphael?
Mas já te digo: é relativamente fácil implementar seu Sistema sem precisar de um RTOS, e ainda assim ele se manter simples e eficiente. Além disso, o ESP já funciona (mesmo que vc não perceba e não use explicitamente) sobre a "casca" de um RTOS, e isso não é a solução escancarada na nossa cara, e nem foi até o momento a solução para seu Sistema. Mas e quanto ao Arduino UNO que tem baixa performance de execução, um RTOS funcionará de forma eficiente nele? essa é outra questão que não abordarei, para não destoar mais ainda aqui, mas vc pode pensar (ou pesquisar) sobre isso, sem esquecer que o Arduino não é apenas Hardware e Código, ele é todo um Sistema, com uma infinidade de dispositivos e módulos disponíveis no mercado para uso imediato, em uma Plataforma aberta, com abrangência praticamente imensurável. Atente pra isto: qualquer coisa funciona no Windows? sim, desde que esta coisa se adeque e respeite as regras do Windows. O mesmo vale para um RTOS (o Windows é um deles).
4) vc disse que está usando um Protocolo "padrão" entre Arduino e ESP, mas não disse se há algum "handshaking" nesse processo, e por conta disso tenho que desconfiar que vc não está usando um Protocolo de fato, uma vez que qualquer um deles bem sedimentado, tem "handshaking". Acredito que o que vc está entendendo como Protocolo, é o enviar e receber Bytes via Serial do Arduino e ESP. Mas isso não é um Protocolo, isso é o "streaming" de dados entre Hardware/Firmware.
Usar um Protocolo, mesmo que seja um muito simples e desenvolvido por vc, é quase imprescindível para que seu Sistema funcione de forma confiável, e novamente: sem trancos e barrancos. Há duas coisas antagônicas entre si a respeito de Protocolos de Comunicação: primeiro, eles são uma chatice (porque cada um faz o seu e quer que ele seja engolido guela abaixo de todos, tornando o Mundo cada vez mais complicado), e segundo: eles são sensacionais (porque vc tem a liberdade de fazer o que é adequado para vc, eventualmente sem depender de nenhum outro Protocolo já zanzando por aí).
Pelo que vc informou no item 3, sobre a "massa de dados", parece claro que vc precisa de um Protocolo simples e eficiente. E felizmente, isto é bem fácil de se fazer (dada a simplicidade dos elementos no seu Hardware), e tornaria o seu Sistema praticamente 100% confiável. E claro, isto contribuiria para a execução suave do seu código, mesmo que diversas tarefas estejam sendo executadas nele (a única questão mais delicada e que exige mais atenção, que vejo neste momento, é a Gravação de dados na EEPROM, mas dando a tratativa adequada, não há com que se preocupar).
5) ok, eu já imaginava que seria algo assim como vc descreveu, devido à informações que vc passou no item "3". Aqui há duas abordagens semelhantes. A primeira é que o recebimento de dados via ESP, força vc a atualizar de forma sistemática (e como se fosse em "tempo real"), os PCFs configurados como saídas. Algo tranquilo, mas que vincula o "Evento de Recepção" via ESP, à atualização pontual dos PCFs, e este vínculo tem que ser bem tratado para não causar um "lag de tempo" estranho ao mundo real. A segunda, é que dados lidos dos PCFs devem ser enviados ao ESP via Serial. Vc não deixou claro, se os dados são enviados rotineiramente em uma taxa constante (e portanto interpretados exclusivamente por quem receber estes dados), ou se uma mudança de estado nos Ports de Entrada dos PCFs, dispara um evento que deve ser interpretado e sinalizado através de envio de dados ao ESP via Serial. Claro que a tratativa para estes dois casos é semelhante, mas não é igual, porque uma envia dados numa taxa constante enquanto a outra envia dados devido a um "Evento Assíncrono" (nota: o fato de o "Wire.requestFrom" estar dentro do "loop" do Arduino, não é conclusivo sobre isso). Eu ressaltei esta diferença, porque se for um evento que exige interpretação e cause efeitos mais complexos e pesados em termos de processamento, deve-se tentar desvincular a leitura de dados (do PCF), da tratativa de eventos relacionados aos dados, e do envio de dados propriamente dito (claro: sempre que isto for possível). Não se assuste achando que isso parece complicado, pois não é.
Sobre o uso do "Wire.requestFrom", tudo bem. Eu tenho usado I2C no Arduino apenas através das Libs de módulos, como por exemplo de RTCs e Displays, e estas Libs já fazem uma tratativa própria, a qual quase sempre não possui a melhor performance. E elas raramente tem algum "callback" que possa ser setado (possivelmente elas usam algum "callback", mas restringem seu uso dentro delas, de forma que a implementação da Classe torna isso "invisível" para nós).
Um "callback" geralmente está associado a alguma Interrupção do Processador, de forma que é chamado como resultado de algum "hook" que esteja ou dentro da respectiva ISR, ou após o término de um ciclo de execução da função "loop" do Arduino (neste caso, dentro da ISR é setada uma "flag" indicadora de que o "callback" deve ser executado após o "loop" do Arduino). E não se iluda achando que porque vc não conectou o pino "INT#" do PCF a um pino de IRQ do Arduino, não estão ocorrendo Interrupções resultantes do funcionamento do I2C. Veja o capítulo sobre "TWI" no datasheet (versão "full") do Atmega328, e vai obter a resposta a isso (claro, a resposta é bem óbvia, mas se puder ler e aprender sobre isso...).
Mas por que estou falando sobre isto? Simples: se puder usar alguma forma de "callback" (seja onde for que ele seja chamado), vc poderá setar uma "flag" dentro desse "callback", sinalizando assim um Evento ocorrido ou detectado, e dessa forma estaria tratando o evento de forma assíncrona à ocorrência dele, mas ainda assim rápido o suficiente para parecer "suave" ao mundo real. E claro: o tratamento assíncrono a esta Evento (indicado pela "flag" setada), estaria em perfeita harmonia com todos os outros elementos existentes no código do seu Sistema (incluindo o próprio envio/recepção via Serial para o ESP). Observe que nem sempre é adequado fazer processamento dentro de um "callback", porque muitas vezes vc não sabe de onde ele será chamado. Então usando uma "flag", vc pode isolar a tratativa com total segurança, encaixando-a numa tarefa que concorra de forma controlada com as demais tarefas no seu Sistema, e assim obtendo um funcionamento "suave".
Por favor: não pense que isto é complicado. Não é. Quando se faz a implementação disto, se constata que é simples (e depois o trabalho pesado fica por conta das Máquinas). É com técnicas assim que se projeta Máquinas para o mundo real (ou pelo menos deveria ser, já que algumas por aí afora funcionam a trancos e barrancos e eventualmente tem comportamentos esquisitos). Pode parecer complicado, mas é apenas aparente, como já dizia nosso grande e saudoso mestre Bêda Marques.
A coisa pode parecer se resumir em apenas escrever dados nos PCFs e ler dados dos PCFs, mas pode haver muito mais coelhos nesta cartola do que parecia inicialmente. Mas isso não significa a existência de algo complicado (como eu disse antes, não é).
Continua no post seguinte, para não estourar a capacidade de texto de um post único.
…
Adicionado por Elcids Chagas ao 18:06 em 17 março 2019
por aí.....bom, fiz algumas alterações....tudo blz.Problema..... bom, como quero na minha automação controlar um ar condicionado, peguei os códigos RAW e coloquei no sketch como unsigned int e coloquei as referencias dele no void loop, logo após onde estavam as referencias dos reles, usando a mesma linha comando para enviar o RAW para o ar.....e aí que da o problema!antes de colocar a sequencia do ar condicionado, eu conseguia ativar os reles com o comando r1on. r20n......pela serial, depois que eu coloquei os comando do ar não funciona mais nada na serial, nem os reles, nem o ar, nada.....se eu deixar somente um comando do ar, funciona, se entra o resto para de funcionar!alguem tem uma sugenstão?Muito obrigado pela ajuda.segue o sketch
#include <SPI.h>#include <Ethernet.h>#include <EEPROM.h>#include <LiquidCrystal.h>#include "DHT.h"#include <IRremote.h>#include <IRremoteInt.h>
#define DHTPIN A12 // what pin we're connected to
// Uncomment whatever type you're using!#define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302)//#define DHTTYPE DHT21 // DHT 21 (AM2301)DHT dht(DHTPIN, DHTTYPE);#define BAUD_RATE 9600#define TERM_CHAR '\n'#define BUF_LEN 30
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac addressbyte ip[] = { 192, 168, 1, 177 }; // ip in lanbyte gateway[] = { 192, 168, 1, 254 }; // internet access via routerbyte subnet[] = { 255, 255, 255, 0 }; //subnet maskEthernetServer server(80); //server portbyte sampledata=50; //some sample data - outputs 2 (ascii = 50 DEC)
float h; //A aquisição dessa informação demora 1 seg , então colocar isto no loop principal afeta o desempenho do programafloat t;int i;int count=0;boolean DispAlarme = false;boolean FlagAlarme = false;boolean AIMode = false;char c;String readString = String(BUF_LEN); //string for fetching data from address
////////////////////RAW AR CONDICIONADO// Botao ligar, MODO AUTO, Temperatura 23, FAN BAIXOunsigned int on23[343] = {9160,4492,760,1472,740,1492,696,436,652,472,636,480,624,492,616,500,596,1644,588,536,564,1668,552,1684,540,584,520,596,520,596,520,596,524,596,520,1712,524,1708,516,1720,512,604,520,596,516,600,520,596,512,608,520,596,516,1712,524,596,520,596,520,1712,524,592,520,1708,524,600,524,592,516,600,520,596,520,596,524,592,512,604,516,596,520,604,516,600,520,592,520,596,524,592,524,592,516,600,528,588,520,592,532,8312,532,592,524,592,520,596,524,592,520,596,532,584,524,592,524,1712,524,592,516,1716,524,1708,524,596,520,592,520,596,520,596,524,596,520,596,524,592,528,588,528,588,524,592,520,596,520,596,520,600,520,596,524,592,524,592,516,600,512,600,520,596,528,588,524,596,524,592,524,592,524,592,520,596,520,596,524,592,520,596,520,600,528,588,528,588,520,596,516,600,516,596,524,592,520,596,528,596,520,596,524,588,520,596,524,592,524,592,520,596,524,592,516,604,524,1704,532,1704,520,596,528,588,524,1704,520,600,524,1704,532,1700,524,8328,524,596,524,592,516,600,520,596,528,588,516,600,520,596,520,600,520,1708,524,596,524,592,520,596,516,600,520,592,520,596,524,600,516,600,524,588,524,592,520,596,520,596,516,600,516,600,516,604,520,596,520,596,520,596,520,596,516,600,520,592,528,588,524,596,524,592,524,592,524,592,520,596,520,596,520,596,516,600,524,596,524,592,520,596,520,596,528,588,520,596,524,592,516,600,520,600,516,1712,520,600,524,592,516,600,524,592,512,600,520,596,528,588,520,};
// trocar de 23 para 24unsigned int on23_24[343] = {9052,4640,612,1620,600,1632,584,552,552,564,536,580,528,588,516,604,512,1724,512,604,516,1716,512,1720,512,604,512,604,512,604,516,600,516,604,512,1720,512,1720,512,604,512,604,512,604,512,604,512,604,516,604,508,608,512,1716,520,596,520,596,520,596,516,1716,516,1716,524,600,512,604,516,596,516,600,516,600,516,600,512,604,520,596,516,604,516,600,520,596,512,604,512,604,512,600,516,600,516,600,512,604,516,8332,520,600,512,600,524,592,520,596,516,600,516,600,516,600,516,1720,512,604,512,1720,520,596,520,1712,520,1712,520,1712,520,600,516,604,516,600,516,596,524,596,512,604,512,600,516,600,516,600,520,600,524,592,516,600,516,600,512,604,516,600,512,600,516,600,516,608,520,592,520,596,516,600,520,596,520,596,516,600,516,600,516,604,512,604,516,600,520,596,512,600,524,592,516,600,516,600,516,604,516,600,516,600,520,596,516,600,516,600,516,600,512,600,520,604,512,1716,520,1716,516,600,520,1712,516,1716,516,600,516,1716,512,1720,520,8328,520,600,512,604,516,596,516,600,520,596,516,600,516,600,516,604,520,596,520,1712,516,600,512,604,512,604,516,600,516,596,528,596,512,604,516,596,512,604,520,596,524,592,512,604,512,604,516,604,516,600,516,600,516,600,516,604,512,596,516,600,520,596,516,604,524,592,520,596,520,596,520,596,520,596,516,600,520,596,516,604,512,604,512,604,516,600,516,600,512,600,516,600,512,604,512,608,516,600,512,1720,516,600,520,596,516,600,520,596,512,604,516,596,532,};
// trocar de 24 para 25unsigned int on24_25[343] = {9004,4672,580,1656,564,1680,544,576,528,588,520,596,520,600,512,600,520,1720,516,600,512,1720,516,1716,512,604,516,596,524,596,512,600,520,604,516,1716,520,1712,516,600,508,608,512,604,516,596,520,596,516,604,516,600,516,1716,520,596,520,596,516,1716,524,1708,524,1712,516,604,520,596,524,592,512,600,520,596,524,592,516,600,516,600,516,604,516,600,512,604,520,596,528,588,512,604,516,600,512,600,524,592,516,8336,520,1712,516,600,516,600,516,596,520,596,520,596,516,600,520,1720,516,600,512,1720,520,592,520,596,520,1716,516,1716,516,600,520,600,516,600,512,604,520,596,520,592,520,596,516,600,516,600,516,604,516,600,516,600,520,596,520,596,520,596,512,604,520,592,524,600,520,592,524,592,524,592,520,596,524,592,520,596,516,600,520,600,516,600,524,592,516,600,520,592,524,592,520,596,520,596,516,608,516,600,516,596,516,600,520,596,520,596,516,600,516,596,524,600,528,588,520,1712,528,588,524,592,516,600,512,600,516,1716,520,1716,520,8328,524,592,516,600,516,600,520,600,512,600,516,600,516,596,516,608,520,592,520,1716,524,588,520,600,516,596,516,600,520,596,516,604,520,596,520,596,520,596,516,600,516,600,520,596,520,596,512,608,516,600,508,608,520,592,516,600,520,596,520,596,524,592,516,604,516,600,516,600,516,600,516,600,520,592,520,596,520,596,516,608,516,596,520,596,524,592,520,596,516,600,516,600,524,592,512,608,520,596,524,1708,520,596,512,604,520,596,516,596,524,592,520,596,528,};
// trocar de 25 para 26unsigned int on25_26[343] = {9008,4668,584,1656,564,1676,548,572,528,588,528,588,520,596,520,596,512,1728,512,600,520,1716,512,1720,516,600,512,604,516,600,512,600,516,608,512,1720,516,1716,516,600,512,604,520,592,524,592,516,600,516,604,520,596,520,1716,520,592,524,592,516,600,516,600,520,596,520,1716,520,596,528,588,520,596,516,600,520,596,520,596,516,600,512,608,524,588,520,596,524,592,524,592,524,592,516,600,512,604,520,592,524,8328,528,1704,520,596,516,600,516,600,516,600,524,592,516,600,512,1724,520,596,516,600,516,1716,520,596,516,1716,528,1704,516,600,520,600,520,596,524,592,516,600,520,596,524,592,516,600,516,596,524,600,516,600,512,600,520,596,520,596,516,600,528,588,524,592,516,604,512,604,516,600,516,600,516,600,516,596,520,596,520,596,520,600,520,596,520,596,520,596,520,596,516,600,516,600,520,596,516,604,516,600,516,600,516,596,524,592,524,592,520,596,520,596,520,600,520,596,520,596,520,1712,520,596,528,1704,516,1716,520,596,524,592,528,8320,528,588,524,592,520,596,516,600,528,588,508,608,512,604,520,600,524,592,520,1712,520,596,512,604,516,600,520,596,516,596,516,608,516,596,524,592,524,592,520,596,516,600,516,600,512,604,520,600,516,600,520,596,520,596,516,596,516,600,516,600,520,596,516,604,520,596,524,592,512,604,516,600,520,596,520,596,516,596,520,604,520,596,512,604,524,588,520,596,520,596,516,600,516,600,528,592,520,596,520,1712,520,596,520,596,516,600,512,604,516,596,528,588,532,};
// trocar de 26 para 27unsigned int on26_27[343] = {9048,4644,608,1628,588,1648,572,560,540,576,536,580,520,596,516,600,516,1720,512,604,516,1716,516,1716,516,600,516,600,524,592,516,600,516,604,516,1716,516,1716,524,592,516,600,520,596,516,600,520,596,512,608,516,600,516,1716,520,596,512,604,516,1716,516,600,520,596,512,1724,520,596,516,600,520,596,516,600,516,600,516,600,512,600,520,604,516,600,516,596,520,596,516,600,516,600,516,600,516,600,520,592,520,8332,520,1712,516,600,516,600,520,596,516,600,512,604,520,596,516,1720,516,600,516,1716,520,1712,516,600,520,1712,524,1708,520,596,520,600,520,596,520,596,516,600,516,600,516,600,516,600,520,596,516,604,512,604,512,604,524,592,516,596,520,600,512,600,520,596,516,608,516,596,520,596,520,596,512,604,516,600,520,596,516,596,516,608,516,600,520,596,516,596,524,592,516,600,516,600,520,596,516,604,516,600,520,596,520,596,520,596,516,596,520,596,520,596,516,608,516,596,524,1708,520,1712,524,592,520,596,524,1708,524,592,520,596,516,8332,524,596,520,596,516,596,520,596,516,600,516,600,520,596,516,604,520,596,512,1720,520,596,516,600,516,600,520,596,516,600,516,604,516,600,520,596,516,600,520,592,520,596,520,596,520,596,516,604,524,592,524,592,512,604,516,600,516,600,516,600,520,596,516,604,516,600,516,596,520,596,524,592,524,592,520,596,520,596,520,600,516,600,516,600,516,600,516,600,516,596,520,596,524,592,520,604,516,596,524,1708,524,592,516,600,516,600,516,600,516,600,516,596,532,};
// desligarunsigned int off_ar[343] = {9032,4644,616,1616,592,1640,580,544,568,560,540,576,532,584,520,596,516,1724,524,592,516,1716,512,1720,516,600,516,600,512,604,516,600,516,604,516,1716,516,1716,520,1712,520,596,516,600,516,600,520,596,516,604,516,600,516,1716,516,600,520,596,520,1712,516,600,520,596,516,1720,516,600,512,604,512,604,520,592,528,588,520,596,520,596,516,604,520,600,512,600,516,600,516,600,520,596,516,600,516,600,520,592,524,8328,524,592,520,1712,512,604,520,596,516,600,516,596,524,592,524,1716,520,596,520,592,520,1716,516,596,520,596,524,592,520,596,520,600,520,596,516,600,520,596,516,600,516,600,516,600,516,600,516,604,516,600,528,584,524,592,524,592,516,600,520,596,520,596,516,604,516,600,520,596,524,592,520,596,516,596,528,588,520,596,516,608,520,592,528,588,524,592,524,592,512,604,516,600,516,600,516,604,512,604,516,600,520,596,520,592,520,596,516,600,520,596,520,600,524,1708,528,1704,524,592,524,592,520,1712,528,588,520,596,520,592,516,8336,528,588,520,596,512,604,512,604,512,604,520,596,516,600,516,604,520,1712,512,604,512,604,516,600,520,592,520,596,516,600,520,600,524,592,520,596,520,596,512,604,516,600,520,596,520,596,520,600,520,596,516,596,520,596,520,596,520,596,516,600,520,596,516,604,524,592,520,596,524,592,520,596,520,592,524,592,516,600,524,600,512,600,516,600,516,600,516,600,520,596,520,596,520,596,520,600,524,1708,520,596,520,596,524,592,520,596,520,592,520,596,520,596,532,};
// ligar vetiladorunsigned int on_vent[343] = {9044,4648,600,1632,588,1644,572,564,544,576,528,588,520,596,520,596,516,1720,516,600,516,1716,516,1716,516,600,512,604,512,604,512,604,512,608,516,1716,516,600,508,1720,520,600,512,604,516,600,512,600,520,604,516,596,516,600,520,1712,520,596,516,1716,520,1712,520,1712,516,608,520,596,516,600,512,600,516,600,520,596,520,596,520,596,516,604,520,596,520,596,516,600,512,604,520,592,516,600,516,600,516,600,520,8328,524,592,516,1716,520,596,520,596,516,600,516,600,520,596,512,1724,516,600,516,1716,520,596,520,1712,516,600,516,600,516,600,516,604,516,600,516,600,516,596,520,596,516,600,516,600,520,596,516,604,520,596,516,600,512,604,516,600,516,600,512,604,512,600,520,604,516,596,516,600,520,596,520,596,520,596,520,596,520,592,524,600,516,600,516,600,512,600,516,604,512,600,520,596,520,596,516,604,520,596,516,600,520,596,516,600,512,600,516,600,516,600,516,604,520,1712,524,592,520,596,516,1716,520,1712,520,1712,520,1712,520,1712,520,8332,520,596,520,596,512,604,516,600,516,600,516,596,516,600,516,604,524,1708,520,596,516,600,516,600,512,604,520,596,516,600,520,600,516,600,520,596,516,600,512,600,516,600,520,596,516,600,516,604,516,600,520,596,516,600,520,596,516,600,520,592,516,600,520,604,516,600,516,596,516,600,516,600,516,600,516,600,512,604,512,608,508,608,512,604,516,596,516,600,516,600,516,600,512,604,520,600,516,1716,516,600,516,600,520,596,516,600,516,596,520,596,516,600,524,};
IRsend irsend;
// reles e contatos secos
int ContatoSecoState1 = 0; // variable for reading the statusint ContatoSecoState2 = 0; // variable for reading the statusint ContatoSecoState3 = 0; // variable for reading the statusint ContatoSecoState4 = 0; // variable for reading the statusint ContatoSecoState5 = 0; // variable for reading the statusint ContatoSecoState6 = 0; // variable for reading the statusint ContatoSecoState7 = 0; // variable for reading the statusint ContatoSecoState8 = 0; // variable for reading the status
int optoacopladorState1 = 0; // variable for reading the statusint optoacopladorState2 = 0; // variable for reading the status
const int rele1 = 22; // Rele 1 PA0 const int rele2 = 23; // Rele 2 PA1 const int rele3 = 24; // Rele 3 PA2 const int rele4 = 25; // Rele 4 PA3 const int rele5 = 26; // Rele 5 PA4 const int rele6 = 27; // Rele 6 PA5 const int rele7 = 28; // Rele 7 PA6 const int rele8 = 29; // Rele 8 PA7 const int rele9 = 42; // Rele 8 PA7 const int rele10 = 43; // Rele 8 PA7
const int contatoseco8 = 41; // the number of the pushbutton pinconst int contatoseco7 = 40; // the number of the pushbutton pinconst int contatoseco6 = 49; // the number of the drybutton pinconst int contatoseco5 = 48; // the number of the drybutton pinconst int contatoseco4 = 47; // the number of the drybutton pinconst int contatoseco3 = 46; // the number of the drybutton pinconst int contatoseco2 = 45; // the number of the drybutton pinconst int contatoseco1 = 44; // the number of the drybutton pin
const int optoacopladorbutton1 = 18; // optobutton detectar 12v const int optoacopladorbutton2 = 19; // optobutton detectar 12vconst int Sirene = 33; //Saida de 12 volts Até 1,5Aconst int Discadora = 32; //Saida de 12 volts até 1A
LiquidCrystal lcd(39, 38, 34, 35, 36, 37);
void setup(){ lcd.begin(16, 2); // Print a message to the LCD. pinMode(rele1, OUTPUT); pinMode(rele2, OUTPUT); pinMode(rele3, OUTPUT); pinMode(rele4, OUTPUT); pinMode(rele5, OUTPUT); pinMode(rele6, OUTPUT); pinMode(rele7, OUTPUT); pinMode(rele8, OUTPUT); pinMode(rele9, OUTPUT); pinMode(rele10, OUTPUT); pinMode(Discadora, OUTPUT); pinMode(Sirene, OUTPUT);
pinMode(contatoseco6, INPUT); pinMode(contatoseco5, INPUT); pinMode(contatoseco4, INPUT); pinMode(contatoseco3, INPUT); pinMode(contatoseco2, INPUT); pinMode(contatoseco1, INPUT); pinMode(contatoseco2, INPUT); pinMode(contatoseco1, INPUT);
pinMode(optoacopladorbutton1, INPUT); pinMode(optoacopladorbutton2, INPUT); //start Ethernet //ip[0] = 192;//EEPROM.read(0); //ip[1] = 168;//EEPROM.read(1); //ip[2] = 1;///EEPROM.read(2); //ip[3] = 177;//EEPROM.read(3); Ethernet.begin(mac, ip, gateway, subnet); server.begin(); lcd.print(Ethernet.localIP());//enable serial datada print Serial.begin(9600); Serial2.begin(9600); //Porta bluetooth Serial3.begin(9600); //Porta Xbee // Todas as portas declaradas aqui aconseguem acionar reles com o seguinte comando _r1on e _r1off para o rele 2 _r2on e _r2off e assim por diante} void loop(){ leserial(); rede(); count++; if(count == 1000){ h = dht.readHumidity(); //A aquisição dessa informação demora 1 seg , então colocar isto no loop principal afeta o desempenho do programa t = dht.readTemperature(); // Mesma regra lcd.setCursor(0,1); lcd.print("H: "); lcd.setCursor(2,1); lcd.print(h); lcd.setCursor(8,1); lcd.print("T: "); lcd.setCursor(10,1); lcd.print(t); count=0; } if(readString.indexOf("r1on") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele1, HIGH); // set the LED on Serial.println("Ligando Rele 1"); Serial3.println("Ligando Rele 1"); Serial.println(readString); } if(readString.indexOf("r1off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele1, LOW); // set the LED on Serial.println("Desligando Rele 1"); Serial3.println("Desligando Rele 1"); Serial.println(readString); } if(readString.indexOf("r2on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele2, HIGH); // set the LED OFF Serial.println("Ligando Rele 2"); Serial3.println("Ligando Rele 2"); Serial.println(readString); } if(readString.indexOf("r2off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele2, LOW); // set the LED on Serial.println("Desligando Rele 2"); Serial3.println("Desligando Rele 2"); Serial.println(readString); } if(readString.indexOf("r3on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele3, HIGH); // set the LED OFF Serial.println("Ligando Rele 3"); Serial3.println("Ligando Rele 3"); Serial.println(readString); } if(readString.indexOf("r3off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele3, LOW); // set the LED on Serial.println("Desligando Rele 3"); Serial3.println("Desligando Rele 3"); Serial.println(readString); } if(readString.indexOf("r4on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele4, HIGH); // set the LED OFF Serial.println("Ligando Rele 4"); Serial3.println("Ligando Rele 4"); Serial.println(readString); } if(readString.indexOf("r4off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele4, LOW); // set the LED on Serial.println("Desligando Rele 4"); Serial3.println("Desligando Rele 4"); Serial.println(readString); } if(readString.indexOf("r5on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele5, HIGH); // set the LED OFF Serial.println("Ligando Rele 5"); Serial3.println("Ligando Rele 5"); Serial.println(readString); } if(readString.indexOf("r5off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele5, LOW); // set the LED on Serial.println("Desligando Rele 5"); Serial3.println("Desligando Rele 5"); Serial.println(readString); } if(readString.indexOf("r6on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele6, HIGH); // set the LED OFF Serial.println("Ligando Rele 6"); Serial3.println("Ligando Rele 6"); Serial.println(readString); } if(readString.indexOf("r6off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele6, LOW); // set the LED on Serial.println("Desligando Rele 6"); Serial3.println("Desligando Rele 6"); Serial.println(readString); } if(readString.indexOf("r7on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele7, HIGH); // set the LED OFF Serial.println("Ligando Rele 7"); Serial3.println("Ligando Rele 7"); Serial.println(readString); } if(readString.indexOf("r7off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele7, LOW); // set the LED on Serial.println("Desligando Rele 7"); Serial3.println("Desligando Rele 7"); Serial.println(readString); } if(readString.indexOf("r8on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele8, HIGH); // set the LED OFF Serial.println("Ligando Rele 8"); Serial3.println("Ligando Rele 8"); Serial.println(readString); } if(readString.indexOf("r8off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele8, LOW); // set the LED on Serial.println("Desligando Rele 8"); Serial3.println("Desligando Rele 8"); Serial.println(readString); } if(readString.indexOf("r9on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele9, HIGH); // set the LED OFF Serial.println("Ligando Rele 9"); Serial3.println("Ligando Rele 9"); Serial.println(readString); } if(readString.indexOf("r9off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele9, LOW); // set the LED on Serial.println("Desligando Rele 9"); Serial3.println("Desligando Rele 9"); Serial.println(readString); } if(readString.indexOf("r10on") >0)//replaces if(readString.contains("L=1")) { digitalWrite(rele10, HIGH); // set the LED OFF Serial.println("Ligando Rele 10"); Serial3.println("Ligando Rele 10"); Serial.println(readString); } if(readString.indexOf("r10off") >0)//replaces if(readString.contains("L=1")) { //led has to be turned ON digitalWrite(rele10, LOW); // set the LED on Serial.println("Desligando Rele 10"); Serial3.println("Desligando Rele 10"); Serial.println(readString); } if(readString.indexOf("ar23") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on23,343,38); // set the LED OFF Serial.println("AR 23"); Serial3.println("AR 23"); Serial.println(readString); } if(readString.indexOf("ar24") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on23_24,343,38); // set the LED OFF Serial.println("AR 24"); Serial3.println("AR 24"); Serial.println(readString); } if(readString.indexOf("ar25") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on24_25,343,38); // set the LED OFF Serial.println("AR 25"); Serial3.println("AR 25"); Serial.println(readString); } if(readString.indexOf("ar26") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on25_26,343,38); // set the LED OFF Serial.println("AR 26"); Serial3.println("AR 26"); Serial.println(readString); } if(readString.indexOf("ar27") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on26_27,343,38); // set the LED OFF Serial.println("AR 27"); Serial3.println("AR 27"); Serial.println(readString); } if(readString.indexOf("desligar") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(off_ar,343,38); // set the LED OFF Serial.println("DESLIGAR"); Serial3.println("DESLIGAR"); Serial.println(readString); } if(readString.indexOf("ventilador") >0)//replaces if(readString.contains("L=1")) { irsend.sendRaw(on_vent,343,38); // set the LED OFF Serial.println("VENTILADOR"); Serial3.println("VENTILADOR"); Serial.println(readString); } ////////////////////////////Aciona sirene ou dicadora ////////////////////////////////////////////
if(readString.indexOf("all=Ativar+Alarme") >0)//replaces if(readString.contains("L=1")) { FlagAlarme = true; lcd.setCursor(0,1); lcd.print(" Alarme Ativado "); //delay(10000); } if(readString.indexOf("all=Desativar+Alarme") >0)//replaces if(readString.contains("L=1")) { FlagAlarme = false; DispAlarme = false; digitalWrite(Discadora, LOW); digitalWrite(Sirene, LOW); lcd.setCursor(0,1); lcd.print(" Alarme Desativado "); } if(readString.indexOf("all=DiscadoraON") >0)//replaces if(readString.contains("L=1")) { digitalWrite(Discadora, HIGH); } if(readString.indexOf("all=DiscadoraOff") >0)//replaces if(readString.contains("L=1")) { digitalWrite(Discadora, LOW); } if (FlagAlarme == true){ le_sensores(); if (DispAlarme == true){ digitalWrite(Sirene, HIGH); // set the LED on digitalWrite(Discadora, HIGH); lcd.setCursor(0,1); lcd.print("Falha na Seguranca"); } }//Teste de opto acopladores detectam 9~12v podem ser usados tambem como zonas de alarmes principalmente para sensores de portas e janelas optoacopladorState1 = digitalRead(optoacopladorbutton1); optoacopladorState2 = digitalRead(optoacopladorbutton2); if(optoacopladorState1 == 0){ lcd.setCursor(0,1); lcd.print("12v entrada 1"); } if(optoacopladorState2 == 0){ lcd.setCursor(0,1); lcd.print("12v entrada 2"); } ////////////////////////////////////////////////////////////////////////////////////////////////////// readString=""; //limpa a string depois de testa-la } //loop ////////////////////////////////////////////////////////////////////////////////////////////////////// //Função Alarme UPvoid le_sensores(){ ContatoSecoState1 = digitalRead(contatoseco1); ContatoSecoState2 = digitalRead(contatoseco2); ContatoSecoState3 = digitalRead(contatoseco3); ContatoSecoState4 = digitalRead(contatoseco4); ContatoSecoState5 = digitalRead(contatoseco5); ContatoSecoState6 = digitalRead(contatoseco6); ContatoSecoState7 = digitalRead(contatoseco7); ContatoSecoState8 = digitalRead(contatoseco8); if (ContatoSecoState1 == LOW){ DispAlarme = true; } if (ContatoSecoState2 == LOW){ DispAlarme = true; } if (ContatoSecoState3 == LOW){ DispAlarme = true; } if (ContatoSecoState4 == LOW){ DispAlarme = true; } if (ContatoSecoState5 == LOW){ DispAlarme = true; } if (ContatoSecoState6 == LOW){ DispAlarme = true; } if (ContatoSecoState7 == LOW){ DispAlarme = true; } if (ContatoSecoState8 == LOW){ DispAlarme = true; } }
//Função lê serialvoid leserial(){ // read incoming message while(Serial.available()){ c = (char) Serial.read(); if (readString.length() < 100) { //store characters to string readString += c; //replaces readString.append(c); } delay(1); // wait for another byte } while(Serial2.available()){ c = (char) Serial2.read(); if (readString.length() < 100) { //store characters to string readString += c; //replaces readString.append(c); } delay(1); // wait for another byte } while(Serial3.available()){ c = (char) Serial3.read(); if (readString.length() < 100) { //store characters to string readString += c; //replaces readString.append(c); } delay(1); // wait for another byte } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// //Função que recebe string do navegador void rede(){ // Create a client connectionEthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { c = client.read(); //read char by char HTTP request if (readString.length() < 100) { //store characters to string readString += c; //replaces readString.append(c); } //output chars to serial port //if HTTP request has ended if (c == '\n') { //dirty skip of "GET /favicon.ico HTTP/1.1" if (readString.indexOf("?") <0) { //skip everything } //else //--------------------------HTML------------------------ client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.print("<html><head>");
client.print("<title>Arduino Webserver Poldi</title>");
client.println("</head>");
client.print("<body bgcolor='#444444'>");
//---Überschrift---client.println("<br><hr />");
client.println("<h1><div align='center'><font color='#2076CD'>Arduino Webserver 1.0 by Mijja</font color></div></h1>");
client.println("<hr /><br>");//---Überschrift---
//---Ausgänge schalten---client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Painel de Controle WEB:</font></div>");
client.println("<br>");
client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Temperatura:");client.print(t);client.println("</font></div>");
client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Umidade:");client.print(h);client.println("</font></div>");
client.println("<br>");
client.println("<table border='1' width='100%' cellpadding='5'>");
client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Sala<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r1on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r1off value='Apagar'></form></td>");
if (digitalRead(rele1)==HIGH) client.println("<td align='center'><font color='green' size='5'>LIG");elseclient.println("<td align='center'><font color='#CFCFCF' size='5'>DES");
client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Cozinha<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r2on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r2off value='Apagar'></form></td>");
if (digitalRead(rele2) == HIGH) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");/////////////////////////////////////////////////////////////////////////////////////////////////////////////client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Garagem<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r3on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r3off value='Apagar'></form></td>");
if (digitalRead(rele3) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////////
client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Suite<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r4on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r4off value='Apagar'></form></td>");
if (digitalRead(rele4) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////////
client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Quarto<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r5on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r5off value='Apagar'></form></td>");
if (digitalRead(rele5) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////////client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Banheiro Suite<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r6on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r6off value='Apagar'></form></td>");
if (digitalRead(rele6) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////////client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Escritorio<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r7on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r7off value='Apagar'></form></td>");
if (digitalRead(rele7) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");///////////////////////////////////////////////////////////////////////////////////////////////////////////////client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Banheiro<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r8on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r8off value='Apagar'></form></td>");
if (digitalRead(rele8) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");/////////////////////////////////////////////////////////////////////////////////////////////////////////////// client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Portão Social<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r9on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r9off value='Apagar'></form></td>");
if (digitalRead(rele9) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");/////////////////////////////////////////////////////////////////////////////////////////////////////////////// client.println("<tr bgColor='#222222'>");
client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Portão Garagem<br></font></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r10on value='Acender'></form></td>");
client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=r10off value='Apagar'></form></td>");
if (digitalRead(rele10) == 1) client.println("<td align='center'><font color='green' size='5'>LIG");else client.println("<td align='center'><font color='#CFCFCF' size='5'>DES"); client.println("</tr>");/////////////////////////////////////////////////////////////////////////////////////////////////////////////// client.println("</tr>");
client.println("</table>");
client.println("<br>");
if (FlagAlarme == 0)client.println("<form method=get><input type=submit name=all value='Ativar Alarme'></form>");elseclient.println("<form method=get><input type=submit name=all value='Desativar Alarme'></form>");
client.println("<br>");client.println("<form method=get><input type=submit name=all value='DiscadoraON'></form>");client.println("<form method=get><input type=submit name=all value='DiscadoraOff'></form>");
//client.println("<form style='height: 257px;' method='get' action='?' name='fomlu_id'></form>");client.println("<form method=get><input name='ip' size='17' maxlength=17>");client.println("<form method=get><input value='Salvar' type=submit></form>");
client.println("</body></html>"); //stopping client client.stop(); } } } //while } //If client } //Void rede…
ndo DS18B20;3.. Calcular o PID;4.. Disparar o Triac no deslocamento calculado pelo PID.
1. A rede de 60hz, passa 2 vezes pelo valor zero a cada ciclo. 1seg = 60 ciclos. 1 ciclo = 1/60 = 16,666 ms cada semiciclo = 8,333ms. usar uma rotina de interrupt que identifica a passagem da voltagem pelo valor zero volts. Com arduino UNO você pode usar ou o port2 (interrupt 0), ou o 3 (interrupt 1). Não é obrigatório, mas é bom definir o port como entrada. (pinMode(x, INPUT);
Uma vez identificado a passagem da voltagem pelo 0 Volts, podemos disparar o TRIAC, (através do MOC), em qq momento entre 0 e 8,333 ms. Se dispararmos em tempo 0, o TRIAC ficará todo o semiciclo disparado (até ao fim do semiciclo, quando é cortado por ter valor zero entre os A1 e A2), produzindo na saída a potencia total da rede sobre a carga. Se dispararmos no tempo 8,332, só teremos uma minima fração de voltagem antes do fim do semiciclo e portanto a minima potencia sobre a carga.
Este disparo deverá ser controlado pelo resultado do calculo do PID.
2. Ler o valor da temperatura. Usar a biblioteca do dispositivo (DS18B20) para a leitura e conversão do valor. (Esta leitura trava o arduino por cerca de 125 milisegundos.) Usar o valor lido para calcular o PID.
3. Aqui entra a parte complexa do sketch. Vou tentar simplificar ao máximo o uso do PID. A biblioteca do PID tem vários métodos e parâmetros para serem definidos. Não vou entrar em detalhes nos Kp, Ki, e Kd. Sobre eles tem bastante tutorial na net. Vamos nos basear somente em alguns parâmetros dos métodos "PID pid(&PresentValue, &ManipulatedValue, &SetPoint, kp, ki, kd, DIRECT);" e "pid.SetOutputLimits(10, 240);"
Neste primeiro método, você fornece 2 parâmetros e recebe um calculado, (alem de Kp,Kd e Ki), Você fornece "PresentValue", (temperatura lida no DS18B20), SetPoint (valor definido por como "240"), e recebe calculado o valor "ManipulatedValue". Vamos analisar simplificando este método. Se o valor lido estiver abaixo de 240, o PID deve disparar o TRIAC, para que aqueça a carga. Ao atingir 240, ou se estiver por qq razão acima deste valor, o TRIAC não é disparado, e a carga deveria diminuir a temperatura.
Aqui vc já deve ter percebido que existe uma incoerência entre o valor que vc lê com o DS18B20 e o valor que estabeleceu para o setpoint. Leitura do DS18B20 de -55°C até +125°C e set point de 240. Desta forma nunca dispara o TRIAC. Como para estes casos não gosto de usar valores decimais (float), eu multiplico a leitura
de temperatura por 100, assim, 29,35°C na realidade uso 2935.
Qual deverá ser seu setpoint? -30,00°C, +48,28°C, +107,23°C, etc? Agora vamos continuar.
Digamos que seu setpoint é de +55,00°C, setpoint = 55,00
4. Disparo do TRIAC com base no valor calculado.
Ao detectar a passagem pelo 0 volts, podemos disparar o TRIAC em qq momento na
condição 0 < disparo < 8,333ms (8333 µS).
Podemos fazer assim: Se precisamos aquecer muito a carga, devemos dispara no inicio, e se for pouco, mais próximo do final. Ai usamos o método "pid.SetOutputLimits(x, y);" para definirmos o resultado. Variar de x até y. "pid.SetOutputLimits(0, 8333);" e usamos o valor "ManipulatedValue" com o método um "delayMicroseconds(ManipulatedValue);" para disparar o TRIAC e controlar a temperatura da carga.
Mas aqui entra um problema: Cada leitura do DS18B20 leva cerca de 125 milisegundos, o equivalente a 15 semiciclos sem poder disparar O autor do sketch que você usou como modelo para o seu usou o sensor LM35, e fez uma leitura de um port analógico. Este processo é muito rápido se comparado com a leitura do DS18B20.
Eu desenvolvi um sketch que faz o que vc quer, mas usei para isto o ESP8266, que tem recursos adicionais que me permitiram contornar este "delay" causado pelo DS18B20.
Espero ter ajudado e esclarecido a causa do travamento do seu sketch.
RV
…
Adicionado por mineirin RV ao 12:27 em 1 maio 2019
peito a eficiência da interface de programação, pois acredito que possa deixar os processos mais rápidos do que já estão.
Eis o vídeo da minha placa seguidora de movimento na pan/tilt
http://www.youtube.com/watch?v=jeU8o2ozeI0
Se leram a descrição do vídeo no YouTube notaram que eu falei que o servo do eixo horizontal queimou a placa, então o religuei como simples motor CC com caixa de redução até chegar um novo servo. Digo isso para não estranharem o código C#.
Código em C#
--------------------------------------------------------------------------------------------------------------------------------------------
#include <Servo.h> #define Leitura 200 // Leitura do sensor - calibrei todos os sensores a terem o mesmo valor, por isso apenas um valor como base
int Sensor_Hor_Esq = A0; // Sensor IR horizontal Esquerdo int Sensor_Hor_Dir = A1; // Sensor IR horizontal Direito int Sensor_Ver_Sup = A2; // Sensor IR Vertiacal Superior int Sensor_Ver_Inf = A3; // Sensor IR Vertical Inferior int moverV = 2300; // Define posição inicial servo
int pino_motor_Hor_A = 6; int pino_motor_Hor_B = 5; Servo servo_Ver; // Objeto para controlar servo Horizontal
void setup() { Serial.begin(9600); servo_Ver.attach(10); pinMode(pino_motor_Hor_A, OUTPUT); pinMode(pino_motor_Hor_B, OUTPUT); servo_Ver.writeMicroseconds(moverV); }
void loop() { // Serial.println(" Sensor Horizontal | Sensor Vertical |"); // Serial.println(" | |"); // Serial.print("Esquerda: "); // Serial.print(analogRead(Sensor_Hor_Esq)); // Serial.print(" |Superior: "); // Serial.print(analogRead(Sensor_Ver_Sup)); // Serial.println(" |"); // Serial.print("Direita: "); // Serial.print(analogRead(Sensor_Hor_Dir)); // Serial.print(" |Inferior: "); // Serial.print(analogRead(Sensor_Ver_Inf)); // Serial.println(" |"); // Serial.println(" "); // Serial.println(" "); // Serial.println("--------------------------------------------------------------------------"); // Serial.println(" "); // Serial.println(" ");
if(analogRead(Sensor_Hor_Esq) < Leitura && analogRead(Sensor_Hor_Dir) > Leitura) { digitalWrite(pino_motor_Hor_A, HIGH); digitalWrite(pino_motor_Hor_B, LOW); delay(1); digitalWrite(pino_motor_Hor_A, LOW); digitalWrite(pino_motor_Hor_B, LOW); } else if(analogRead(Sensor_Hor_Esq) > Leitura && analogRead(Sensor_Hor_Dir) < Leitura) { digitalWrite(pino_motor_Hor_A, LOW); digitalWrite(pino_motor_Hor_B, HIGH); delay(1); digitalWrite(pino_motor_Hor_A, LOW); digitalWrite(pino_motor_Hor_B, LOW);
} if(analogRead(Sensor_Ver_Sup) < Leitura && analogRead(Sensor_Ver_Inf) > Leitura && moverV > 1500) // 1500 movimento minimo limitado pela pan/tilt { moverV -=1; servo_Ver.writeMicroseconds(moverV); delayMicroseconds(100); } else if(analogRead(Sensor_Ver_Sup) > Leitura && analogRead(Sensor_Ver_Inf) < Leitura && moverV < 2300) // 2300 movimento máximo na pan/tilt { moverV +=1; servo_Ver.writeMicroseconds(moverV); delayMicroseconds(100); }
}
------------------------------------------------------------------------------------------------------------------------------------------
Alguém vê a possibilidade de conseguir melhorar a velocidade dos processos ?? principalmente a respeito do do movimento Vertical, que esta usando um servo motor. Pois o horizontal esta o mais breve possível usando motores CC, não tendo como diminuir.
--------------------------------------------------------------------------------------------------------------------------------------------
Editado - Acrescentando esquema elétrico da placa mediante a pedido.
--------------------------------------------------------------------------------------------------------------------------------------------
Este é o esquema ilustrado da placa, com detalhes da montagem e valores dos componentes.
Veja que os componentes foram dispostos conforme a montagem original da placa, isso para facilitar caso alguém venha querer fazer a montagem da mesma em uma placa protótipo.
E aqui uma foto da placa vista de frente, para se ter uma ideia.
(foto com meu celular já meio antigo, desculpe a qualidade.)
Qualquer outra informação, basta perguntar.…
te ta funcionando
/* Nome do Projeto: Chocadeira Nome do Aquivo: Choca_DHT11_V01.ino Dependencias: DHT.h Biblioteca de DHT11 LiquidCrystal.h Biblioteca de LCD MCU: ATmega Board: Arduino Uno/Mega/Mini Compilador N/A IDE: Arduino IDE 1.6.4 Hardware: Arduino UNO Escrito por: Rui Viana Testado :Jose Erivaldo
Data: 28/06/2015 Uso: Didático Desenhos Chocadeira_DHT11.jpg Copyright @ N/A Este programa é software livre; e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA; mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. REVISIONS: (latest entry first) 2015-06-28 - Choca_DHT11_V01.ino - First release ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Descricão: Este código utilza a biblioteca DHT.h para ler sensores de humidade e de temperatura. E a biblioteca LiquidCrystal.h para mostrar a temperatura e a humidade no diplay LCD. Compara o valor da leitura com o valor programado, e define se liga ou desliga o rele que alimenta as resistencias de aquecimento. Tem dois botoes, um para aumentar e outro para diminuir a programação da temperatura*///************ Variaveis e constantes ************ #include <LiquidCrystal.h> // Inclui a biblioteca do LCD #include "DHT.h" // Inclui a biblioteca do DHT11 #define DHTPIN A1 // pino que estamos conectado #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal lcd( 7, 8, 9, 10, 11, 12); // Pinos do LCD const int Rele = 13; // Pino de Saída const int Up = 2; // Pino do switch de Up const int Dn = 3; // Pino do switch de Dn float TempProg = 27; // Variavel com temperatura programada long debouncing_time = 15; // Debouncing Time in Milliseconds volatile unsigned long last_micros; // Variavel para deboucing float celsius; // Varialvel para guardar valor de temperatura byte humidade; // Varialvel para guardar valor de humidade//*********************** Setup ******************* void setup() { lcd.begin(16, 2); // Inicia o LCD com dimensões 16x2(Colunas x Linhas) pinMode(Rele, OUTPUT); // Port como saída digitalWrite(Rele, LOW); // Desliga Rele pinMode(Up, INPUT_PULLUP); // Port do switch Up como entrada e Pull-Up pinMode(Dn, INPUT_PULLUP); // Port do switch Dn como entrada e Pull-Up dht.begin(); // inicializa o Sensor delay(1000); // Aguarda 1 seg antes de acessar as informações do sensor attachInterrupt(1, PressUp, RISING); // Interrupt de botão ao ficar HIGH o pino 3 attachInterrupt(0, PressDn, RISING); // Interrupt de botão ao ficar HIGH o pino 2 lcd.clear(); // Limpa do buffer do LCD lcd.setCursor(0, 0); // Seleciona posição 0 da linha 0 lcd.print("Chocadeira"); // Imprime texto lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0 lcd.print(TempProg); // Imprime variavel }//*************** Rotina PressUp ***************** void PressUp() // Rotina chamada pela interrupcao do botão de aumento { if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing { TempProg = TempProg + 0.1; // Incrementa temperatura em 0,01 oC lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0 lcd.print(TempProg); // Imprime variavel last_micros = micros(); // Tempo de debouncing } }//*************** Rotina PressDn ***************** void PressDn() // Rotina chamada pela interrupcao do botão de reducao { if((long)(micros() - last_micros) >= debouncing_time * 1000) // Tempo de debouncing { TempProg = TempProg - 0.1; // Decrementa temperatura em 0,01 oC lcd.setCursor(11, 1); // Seleciona posição 0 da linha 0 lcd.print(TempProg); // Imprime variavel last_micros = micros(); // Tempo de debouncing } }//*********************** Loop ******************** void loop() { celsius = dht.readTemperature(); // Le temperatura no DHT11 humidade = dht.readHumidity(); // Le humidade no DHT11 lcd.setCursor(11, 0); // Seleciona posição 0 da linha 0 lcd.print("H "); // Imprime texto lcd.print(humidade); // Imprime humidade if (celsius >= TempProg) // Faça se a temperatura for menor que a programada digitalWrite(Rele, LOW); // Desliga Rele como entrada e Pull-Up else // Ou se não for digitalWrite(Rele, HIGH); // Liga Rele como entrada e Pull-Up lcd.setCursor(0, 1); // Seleciona posição 0 da linha 0 lcd.print(celsius); // Imprime a gemperatura lcd.setCursor(6, 1); // Seleciona posição 6 da linha 0 if (digitalRead(Rele) == 1) // Faça se o rele tiver operado lcd.print("Lig "); // Imprime texto else // Ou se não tiver lcd.print("Desl"); // Imprime texto delay(200); }…
o codigo do projeto.
include <LiquidCrystal.h> // Inclui a biblioteca para utilizar o LCD.#define sensor1 0 // Define o pino A0 como “sensor1”#define sensor2 1 // Define o pino A1 como "sensor2"
////////////////////////////////////////////VARIAVEIS BOTAO E ESTAGIO BOTAO////////////////////////////////////////////////////////////
const int BUTTON1P = 22; //Pino de entrada do botao 1 POSITIVOconst int BUTTON1N = 23; //Pino de entrada do botao 1 NEGATIVOconst int BUTTON2P = 24; //Pino de entrada do botao 2 POSITIVOconst int BUTTON2N = 25; //Pino de entrada do botao 2 NEGATIVOint STAGEBUTTON1P = 0; //Variavel que armazenara o estado do botao POSITIVOint STAGEBUTTON1N = 0; //Variavel que armazenara o estado do botao NEGATIVOint STAGEBUTTON2P = 0; //Variavel que armazenara o estado do botao POSITIVOint STAGEBUTTON2N = 0; //Variavel que armazenara o estado do botao NEGATIVOint SET1; //Variavel que armazenara a temperatura Setada do PRIMEIRO Sensorint SET2; //Variavel que armazenara a temperatura Setada do SEGUNDO Sensor///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////VARIAVEIS DOS SENSORES E TEMPERATURA//////////////////////////////////////////////////
int Ventrada1; // Variável para ler o sinal do pino0 do Arduinoint Ventrada2; // Variável para ler o sinal do pino1 do Arduinofloat Temperatura1; // Variável que recebe o valor convertido para temperatura1.float Temperatura2; // Variável que recebe o valor convertido para temperatura2.///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LiquidCrystal lcd (12, 11, 5, 4, 3, 2); // Esta função acima declara quais os pinos do Arduino serão utilizados para o controle do LCD
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
lcd.begin(16, 2); // Diz para o Arduino que o display é 16x2. lcd.setCursor(0, 0); // Move o cursor do display para a primeira COLUNA na LINHA 0. lcd.print("1|TS= TA= "); // Manda o texto para a tela do display lcd.setCursor(0, 1); // Move o cursor do display para a primeira COLUNA0 na LINHA 1. lcd.print("2|TS= TA= "); // Manda o texto para a tela do display
//////////////////////////////////////////////////SETA OS PINOS DOS BOTOES COMO ENTRADAS////////////////////////////////////////////////
pinMode(BUTTON1P, INPUT); //Seta o pino como botao como entradapinMode(BUTTON1N, INPUT); pinMode(BUTTON2P, INPUT); //Seta o pino como botao como entradapinMode(BUTTON2N, INPUT);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
} void loop(){ ///////////////////Botao/////////////////////////////// STAGEBUTTON1P = digitalRead(BUTTON1P); //le e recebe o valor do botao STAGEBUTTON1N = digitalRead(BUTTON1N); STAGEBUTTON2P = digitalRead(BUTTON2P); //le e recebe o valor do botao STAGEBUTTON2N = digitalRead(BUTTON2N);
if (STAGEBUTTON1P == HIGH) { SET1 = SET1+1; lcd.setCursor(7, 0); // Move o cursor do display para a segunda linha. lcd.print(" "); lcd.setCursor(7, 0); // Move o cursor do display para a segunda linha. lcd.print(SET1); // Exibe o valor de temperatura no display. } if (STAGEBUTTON1N == HIGH) { SET1 = SET1-1; lcd.setCursor(6, 0); // Move o cursor do display para a segunda linha. lcd.print(" "); lcd.setCursor(6, 0); // Move o cursor do display para a segunda linha. lcd.print(SET1); // Exibe o valor de temperatura no display. } if (STAGEBUTTON2P == HIGH) { SET2 = SET2+1; lcd.setCursor(7, 1); // Move o cursor do display para a segunda linha. lcd.print(SET2);
} if (STAGEBUTTON2N == HIGH) { SET2 = SET2-1; lcd.setCursor(7, 1); // Move o cursor do display para a segunda linha. lcd.print(SET2); } Ventrada1 = analogRead (sensor1); // Manda o Arduino ler o pino e armazena o valor em “Ventrada1”. Temperatura1=(500*Ventrada1)/1023; // Converte o valor de tensão em temperatura e armazena na variável “Temperatura1” lcd.setCursor(13, 0); // Move o cursor do display para a segunda linha. lcd.print(Temperatura1); // Exibe o valor de temperatura no display. lcd.print(" C"); // Escreve “C” para dizer que a escala é Celsius.
Ventrada2 = analogRead (sensor2); // Manda o Arduino ler o pino e armazena o valor em “Ventrada2”. Temperatura2=(500*Ventrada2)/1023; // Converte o valor de tensão em temperatura e armazena na variável “Temperatura2” lcd.setCursor(13, 1); // Move o cursor do display para a segunda linha. lcd.print(Temperatura2); // Exibe o valor de temperatura no display. lcd.print(" C"); // Escreve “C” para dizer que a escala é Celsius.
delay(1000); // Aguarda 1 segundo para efetuar uma nova leitura de temperatura.
}…