ojeto é controlar um ventilador pelo celular via bluetooth e pelo botão físico (chave seletora de velocidade) já existente no ventilador. No ventilador, existe uma chave seletora que controla a velocidade do mesmo. É uma chave que possui 1 comum(que vem da rede elétrica) e 3 saídas para o ventilador. A velocidade é de acordo com cada saída. No caso é um ventilador de 3 velocidades obviamente. O que eu fiz foi seguinte: substituí a chave seletora por 3 relés. o comum da rede que vai pra chave seletora, eu desconectei da chave seletora e conectei no comum de cada relé e os fios das saídas da chave seletora que vão para o ventilador eu desconectei da chave seletora e conectei nos NA de cada relé. E no comum da chave seletora, eu conectei o GND, e as saídas da chave seletora, eu conectei em 3 portas digitais do meu Arduíno Nano. Ou seja, a chave seletora virou um periférico de entrada de dados. obs: Sabemos que são dois fios que vem da rede elétrica pro ventilador, um fio vai direto para o motor do ventilador e ou outro vai pra chave seletora e as saídas da chave seletora que vão pra o ventilador. As modificações que eu fiz foi no fio que vai para a chave seletora, o outro fio que vai direto para o motor do ventilador eu não modifiquei nada. Usando o módulo bluetooth , eu conectei meu celular, usando um app. Assim posso realizar o controle do ventilador (regulagem de velocidade e ligar/desligar) tanto pelo celular, quanto pela própria chave seletora do mesmo. O projeto funciona basicamente assim: Quando enviar o comando do celular ou da chave seletora pra escolher determinada velocidade ou ligar/desligar o ventilador, o arduíno vai energizar o relé responsável pela tal velocidade ou ligar/desligar o ventilador, dependendo do comando enviado do celular ou da chave seletora. Ou seja, o arduíno vai controlar os relés que são responsáveis pela regulagem de velocidade e por ligar/desligar o ventilador. Ex: se eu enviar o comando do celular ou da chave seletora pro ventilador girar na velocidade 3, o arduíno vai energizar o relé responsável por essa velocidade, conectando o fio responsável por essa velocidade a rede elétrica. E quando enviar o comando pra desligar o ventilador, o arduíno vai desenergizar todos os relés e consequentemente desligará o ventilador. Realizei os testes do meu projeto sem carga, e funcionou perfeitamente. Mas com carga (ventilador), fica dando "bug" no meu projeto. Esses bugs são o seguinte: Quando mando algum comando do celular pra determinada velocidade, os 3 relés só piscam (eles ligam e desligam)...as vezes envio um comando pra energizar o relé 1, aí o relé 2 ou 3 que é energizado por exemplo, outras vezes até desliga o ventilador. Aí pra executar a ação que eu desejo, tenho que dar o comando 5 ou 6 vezes. Volto a repetir, esse bug só acontece quando o ventilador tá conectado aos relés. Sem o ventilador, os relés funcionam perfeitamente. Obs: os parâmetros (tensão e corrente) da minha carga(ventilador) estão dentro dos limites de parâmetros dos relés e esse erro só acontece quando envio os comandos pelo celular. Na chave seletora, funciona perfeitamente.
segue em anexo o diagrama elétrico do meu projeto.…
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36 }; // Endereço Macbyte ip[] = { 192, 168, 0, 110 }; // Endereço de Ip da sua RedeEthernetServer server(8090); // Porta de serviço
int area = 2;int sala = 3;int escritorio = 5;int trava = 6;int portao = 7;String readString = String(30); // string para buscar dados de endereço
// para o optacoplador Áreaconst int analogArea = A0;int sensorArea = 0;String statusArea;
// para o optacoplador Salaconst int analogSala = A1;int sensorSala = 0;String statusSala;
// para o optacoplador Escritórioconst int analogEscritorio = A2;int sensorEscritorio = 0;String statusEscritorio;
boolean statusPortao = false; // Variável para o status do portão
void setup(){ // Inicia o Ethernet Ethernet.begin(mac, ip); // Define os pinos como saída pinMode(area, OUTPUT); pinMode(sala, OUTPUT); pinMode(escritorio, OUTPUT); pinMode(trava, OUTPUT); pinMode(portao, OUTPUT); // Inicia a comunicação Serial Serial.begin(9600); }
void loop(){ //Verifica o status do sensor da Área sensorArea = analogRead(analogArea); if (sensorArea >=300) { statusArea = ("lampada area ligada"); } else { statusArea = ("lampada area desligada"); } //Verifica o status do sensor da Sala sensorSala = analogRead(analogSala); if (sensorSala >=300) { statusSala = ("lampada sala ligada"); } else { statusSala = ("lampada sala desligada"); } //Verifica o status do sensor do Escritório sensorEscritorio = analogRead(analogEscritorio); if (sensorEscritorio >=300) { statusEscritorio = ("lampada escritorio ligada"); } else { statusEscritorio = ("lampada escritorio desligada"); } // Criar uma conexão de cliente EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); // ler caractere por caractere vindo do HTTP if (readString.length() < 30) { // armazena os caracteres para string readString += (c); } //se o pedido HTTP terminou if (c == '\n') { // vamos verificar se a lâmpada da área deve ser ligada // Se a string possui o texto L=Ligar if(readString.indexOf("LigarArea")>=0) { // A lâmpada vai ser ligada digitalWrite(area, HIGH); } // Se a string possui o texto L=Desligar if(readString.indexOf("DesligarArea")>=0) { // A lâmpada vai ser desligada digitalWrite(area, LOW); } { // vamos verificar se a lâmpada da sala deve ser ligada // Se a string possui o texto L=Ligar if(readString.indexOf("LigarSala")>=0) { // A lâmpada vai ser ligada digitalWrite(sala, HIGH); } // Se a string possui o texto L=Desligar if(readString.indexOf("DesligarSala")>=0) { // A lâmpada vai ser desligada digitalWrite(sala, LOW); } { // vamos verificar se a lâmpada do escritório deve ser ligada // Se a string possui o texto L=Ligar if(readString.indexOf("LigarEscritorio")>=0) { // A lâmpada vai ser ligada digitalWrite(escritorio, HIGH); } // Se a string possui o texto L=Desligar if(readString.indexOf("DesligarEscritorio")>=0) { // A lâmpada vai ser desligada digitalWrite(escritorio, LOW); } { // vamos verificar se o portão deve abrir // Se a string possui o texto L=Ligar if(readString.indexOf("LigarPortao")>=0) { // O portão vai ser aberto digitalWrite(portao, HIGH); delay (1000); digitalWrite(portao, LOW); statusPortao = true; } // Se a string possui o texto L=Desligar if(readString.indexOf("DesligarPortao")>=0) { // O portão vai ser fechado digitalWrite(portao, HIGH); delay (1000); digitalWrite(portao, LOW); statusPortao = false; } { // vamos verificar se a trava deve ser aberta // Se a string possui o texto L=Ligar if(readString.indexOf("LigarTrava")>=0) { // A trava vai ser aberta digitalWrite(trava, HIGH); delay (2000); digitalWrite(trava, LOW); }
// dados HTML de saída começando com cabeçalho padrão client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<font size='20'>"); // aqui vai imprimir o conteúdo da string client.print("<h5>"); client.print(statusArea); client.print("</h5>"); // aqui vai imprimir o conteúdo da string client.print("<h5>"); client.print(statusSala); client.print("</h5>"); // aqui vai imprimir o conteúdo da string client.print("<h5>"); client.print(statusEscritorio); client.print("</h5>"); client.println("<font size='20'>"); if (statusPortao) { client.print("<h5>"); client.println("PortaoAberto"); client.print("<h5>"); } else { client.print("<h5>"); client.println("PortaoFechado"); client.print("<h5>"); } //limpa string para a próxima leitura readString=""; // parar cliente client.stop(); } } } }}}} }}
Só que eu fiz o aplicativo android no App inventor segue as fotos:
Essa é a tela, que ja mudei varias vezes
Esses são os blocos da lógica
Caso se interesse dê uma olhada nas video aulas do androi e arduino no you tube:
https://www.youtube.com/user/TecnoEduardo
O Eduardo explica tudo sobre android e arduino.
…
xceder 10
//Inverta a saída dos leds
boolean outputInverted = true; //true or false
// Isso é feito no caso a placa de relé acionar o relé em negativo, ao invés de positivo//Html page refresh
int refreshPage = 20; //default is 50sec.
//Tenha em atenção que, se conseguir que a atualização seja muito rápida, a página pode ficar inacessível
//Exibir ou ocultar os botões "Ativar todos os pinos" na parte inferior da página
int switchOnAllPinsButton = false; //true or false
int outputAddress[] = { 22,24,26,28,30,32,34,36,38,40,42,44,46,48,49,47,43,41,45}; //Allocate 10 spaces and name the output pin address.
String buttonText[19] = {
"01.ESCRITORIO","02.RUIVA V","03.RUIVA Q","04.CORREDOR 2","05.CORREDOR 1 ","06.FR.PORTAO","07.LATERAL","08.VARANDA","09.SNOW","10.CHURRASQ.","11.LIVRE","12.LIVRE","13.LIVRE","14.LIVRE","15.LIVRE","16.LIVRE","17.LIVRE","18.LIVRE","19.LIVRE"};
// Defina a saída para manter o último status após a reciclagem de energia.
int retainOutputStatus[19] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//1-reter o último status. 0-será desligado após o corte de energia.
////////////////////////////////////////////////////////////////////////
//VARIABLES DECLARATION
////////////////////////////////////////////////////////////////////////
int outp = 0;
boolean printLastCommandOnce = false;
boolean printButtonMenuOnce = false;
boolean initialPrint = true;
String allOn = "";
String allOff = "";
boolean reading = false;
boolean outputStatus[19]; //Crie uma matriz booleana para a quantidade máxima.
String rev = "";
unsigned long timeConnectedAt;
boolean writeToEeprom = false;
/////////////////////////////////////////////////
// Temperature Related Reading
const int tempInPin = A1;
int tempInValue = 0; //temperature read
int tempScaleOutValue = 0; //temperature formatted
int tempOutValue = 0; //temperature formatted
float tempOutDeg = 0.0;
////////////////////////////////////////////////////////////////////////
//RUN ONCE
////////////////////////////////////////////////////////////////////////
//Beginning of Program //Sensor de presença
int pinoled1 = 8; //Pino ligado ao led vermelhoint pinoled2 = 9; //Pino ligado ao led amareloint pinoled3 = 19; //Pino ligado ao led verdeint pinoled4 = 10; //Pino ligado ao led azul
int pinopir1 = 2; //Pino ligado ao sensor PIRint pinopir2 = 3; //Pino ligado ao sensor PIRint pinopir3 = 4; //Pino ligado ao sensor PIRint pinopir4 = 5; //Pino ligado ao sensor PIRint acionamento; //Variavel para guardar valor do sensor
void setup(){
Serial.begin(9600);
initEepromValues();
readEepromValues();
//Set pins as Outputs
boolean currentState = false;
int var;
for (int i = 0; i < outputQuantity; i++){ pinMode(pinoled1, OUTPUT); //Define pino como saida pinMode(pinopir1, INPUT); //Define pino sensor como entrada
pinMode(pinoled2, OUTPUT); //Define pino como saida pinMode(pinopir2, INPUT); //Define pino sensor como entrada
pinMode(pinoled3, OUTPUT); //Define pino como saida pinMode(pinopir3, INPUT); //Define pino sensor como entrada
pinMode(pinoled4, OUTPUT); //Define pino como saida pinMode(pinopir4, INPUT); //Define pino sensor como entrada
pinMode(outputAddress[i], OUTPUT);
var = outputAddress[i];
//Switch all outputs to either on or off on Startup
if(outputInverted == true) {
//digitalWrite(outputAddress[var], HIGH);
if(outputStatus[i] == 0){currentState = true;}else{currentState = false;} //check outputStatus if off, switch output accordingly
digitalWrite(var, currentState);
}
else{
//digitalWrite(outputAddress[var], LOW);
if(outputStatus[i] == 0){currentState = false;}else{currentState = true;}//check outputStatus if off, switch output accordingly
digitalWrite(var, currentState);
}
}
//Setting up the IP address. Comment out the one you dont need.
//Ethernet.begin(mac); //for DHCP address. (Address will be printed to serial.)
Ethernet.begin(mac, ip, gateway, subnet); //for manual setup. (Address is the one configured above.)
server.begin();
Serial.print("Server started at ");
Serial.println(Ethernet.localIP());
}
////////////////////////////////////////////////////////////////////////
//LOOP
////////////////////////////////////////////////////////////////////////
//Run once
void loop(){
acionamento = digitalRead(pinopir1); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled1, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled1, HIGH); }
acionamento = digitalRead(pinopir2); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled2, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled2, HIGH);}
acionamento = digitalRead(pinopir3); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled3, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled3, HIGH); } acionamento = digitalRead(pinopir4); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled4, LOW); } else //Caso seja detectado um movimento, aciona o led azul { digitalWrite(pinoled4, HIGH); }
//Read Temperature Sensor
tempInValue = analogRead(tempInPin);
// Connecting a 10K3 Thermistor to the Arduino Input
// +5V �—————————[10Kohms]—————————[Thermistor]——� 0V
// To Arduino IP �———————————|
tempScaleOutValue = map(tempInValue, 0, 1023, 1023, 0); //Arduino value and NTC of the 10K3 Thermistor
tempOutValue = map(tempScaleOutValue, 130, 870, -170, 730); //range of Arduino Value compared with Temperature
tempOutValue = tempOutValue -45; //Adjustments
tempOutDeg = tempOutValue / 10.0;
checkForClient();
}
////////////////////////////////////////////////////////////////////////
//checkForClient Function
////////////////////////////////////////////////////////////////////////
//
void checkForClient(){
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
boolean sentHeader = false;
int temp,temp1;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if(c == '*'){
printHtmlHeader(client); //call for html header and css
printLoginTitle(client);
printHtmlFooter(client);
break;
}
if(!sentHeader){
printHtmlHeader(client); //call for html header and css
printHtmlButtonTitle(client); //print the button title
sentHeader = true;
}
if(reading && c == ' '){
reading = false;
}
if(c == '?') {
reading = true; //found the ?, begin reading the info
}
if(reading){
//if user input is H set output to 1
if(c == 'H') {
outp = 1;
}
if(c == 'L') {
outp = 0;
}
// Serial.println(c); //print the value of c to serial communication
//---------------------------------------------------------------------------------------------
// ? H 1 0
// ^ ^ ^ ^
// | | | |____________read 4 ( 10,11,12,13....)
// | | |______________read 3 ( 1....9)
// | |________________read 2 if user input is H set output to L
// |__________________read 1
//---------------------------------------------------------------------------------------------
if( c == '1'){
char c = client.read();
switch (c) {
case '0':
triggerPin(outputAddress[10], client, outp);
break;
case '1':
triggerPin(outputAddress[11], client, outp);
break;
case '2':
triggerPin(outputAddress[12], client, outp);
break;
case '3':
triggerPin(outputAddress[13], client, outp);
break;
case '4':
triggerPin(outputAddress[14], client, outp);
break;
case '5':
triggerPin(outputAddress[15], client, outp);
break;
case '6':
triggerPin(outputAddress[16], client, outp);
break;
case '7':
triggerPin(outputAddress[17], client, outp);
break;
case '8':
triggerPin(outputAddress[18], client, outp);
break;
case '9':
triggerPin(outputAddress[19], client, outp);
break;
default:
char c = client.read();
triggerPin(outputAddress[1], client, outp);
}
}
else {
switch (c) {
case '0':
triggerPin(outputAddress[0], client, outp);
break;
// case '1':
// triggerPin(outputAddress[1], client, outp);
// break;
case '2':
triggerPin(outputAddress[2], client, outp);
break;
case '3':
//add code here to trigger on 3
triggerPin(outputAddress[3], client, outp);
break;
case '4':
//add code here to trigger on 4
triggerPin(outputAddress[4], client, outp);
break;
case '5':
//add code here to trigger on 5
triggerPin(outputAddress[5], client, outp);
//printHtml(client);
break;
case '6':
//add code here to trigger on 6
triggerPin(outputAddress[6], client, outp);
break;
case '7':
//add code here to trigger on 7
triggerPin(outputAddress[7], client, outp);
break;
case '8':
//add code here to trigger on 8
triggerPin(outputAddress[8], client, outp);
break;
case '9':
//add code here to trigger on 9
triggerPin(outputAddress[9], client, outp);
break;
} //end of switch case
}
}//end of switch switch the relevant output
//if user input was blank
if (c == '\n' && currentLineIsBlank){
printLastCommandOnce = true;
printButtonMenuOnce = true;
triggerPin(777, client, outp); //Call to read input and print menu. 777 is used not to update any outputs
break;
}
}
}
printHtmlFooter(client); //Prints the html footer
}
else{
if (millis() > (timeConnectedAt + 60000)){
if (writeToEeprom == true){
writeEepromValues(); //write to EEprom the current output statuses
Serial.println("No Clients for more then a minute - Writing statuses to Eeprom.");
writeToEeprom = false;
}
}
}
}// END
////////////////////////////////////////////////////////////////////////
//triggerPin Function
////////////////////////////////////////////////////////////////////////
//
void triggerPin(int pin, EthernetClient client, int outp){
if (pin != 777){
// Serial.println(pin);
if(outp == 1) {
if (outputInverted ==false){
digitalWrite(pin, HIGH);
}
else{
digitalWrite(pin, LOW);
}
}
if(outp == 0){
if (outputInverted ==false){
digitalWrite(pin, LOW);
}
else{
digitalWrite(pin, HIGH);
}
}
}
//Refresh the reading of outputs
readOutputStatuses();
//Prints the buttons
if (printButtonMenuOnce == true){
printHtmlButtons(client);
printButtonMenuOnce = false;
}
}
////////////////////////////////////////////////////////////////////////
//printHtmlButtons Function
////////////////////////////////////////////////////////////////////////
//print the html buttons to switch on/off channels
void printHtmlButtons(EthernetClient client){
//Start to create the html table
client.println("");
//client.println("<p>");
client.println("<FORM>");
client.println("<table border=\"0\" align=\"center\">");
//Printing the Temperature
client.print("<tr>\n");
client.print("<td><h4>");
client.print("Temperatura");
client.print("</h4></td>\n");
client.print("<td></td>");
client.print("<td>");
client.print("<h3>");
client.print(tempOutDeg);
client.print(" °C</h3></td>\n");
client.print("<td></td>");
client.print("</tr>");
//Start printing button by button
for (int var = 0; var < outputQuantity; var++) {
//set command for all on/off
allOn += "H";
allOn += outputAddress[var];
allOff += "L";
allOff += outputAddress[var];
//Print begining of row
client.print("<tr>\n");
//Prints the button Text
client.print("<td><h4>");
client.print(buttonText[var]);
client.print("</h4></td>\n");
//Prints the ON Buttons+++++++++++++++++++++++++++++++++++++++++++++++
client.print("<td>");
client.print("<INPUT TYPE=\"button\" VALUE=\"ON ");
client.print("\" onClick=\"parent.location='/?H");
client.print(var);
client.print("'\"></td>\n");
//Prints the OFF Buttons ---------------------------------------------
client.print(" <td><INPUT TYPE=\"button\" VALUE=\"OFF");
client.print("\" onClick=\"parent.location='/?L");
client.print(var);
client.print("'\"></td>\n");
//Invert the LED display if output is inverted.
if (outputStatus[var] == true ){ //If Output is ON
if (outputInverted == false){ //and if output is not inverted
client.print(" <td><div class='green-circle'><div class='glare'></div></div></td>\n"); //Print html for ON LED
}
else{ //else output is inverted then
client.print(" <td><div class='black-circle'><div class='glare'></div></div></td>\n"); //Print html for OFF LED
}
}
else //If Output is Off
{
if (outputInverted == false){ //and if output is not inverted
client.print(" <td><div class='black-circle'><div class='glare'></div></div></td>\n"); //Print html for OFF LED
}
else{ //else output is inverted then
client.print(" <td><div class='green-circle'><div class='glare'></div></div></td>\n"); //Print html for ON LED
}
}
//Print end of row
client.print("</tr>\n");
}
//Display or hide the Print all on Pins Button
if (switchOnAllPinsButton == true ){
//Prints the ON All Pins Button
client.print("<tr>\n<td><INPUT TYPE=\"button\" VALUE=\"Switch ON All Pins");
client.print("\" onClick=\"parent.location='/?");
client.print(allOn);
client.print("'\"></td>\n");
//Prints the OFF All Pins Button
client.print("<td><INPUT TYPE=\"button\" VALUE=\"Switch OFF All Pins");
client.print("\" onClick=\"parent.location='/?");
client.print(allOff);
client.print("'\"></td>\n<td></td>\n<td></td>\n</tr>\n");
}
//Closing the table and form
client.println("</table>");
client.println("</FORM>");
//client.println("</p>");
}
////////////////////////////////////////////////////////////////////////
//readOutputStatuses Function
////////////////////////////////////////////////////////////////////////
//Reading the Output Statuses
void readOutputStatuses(){
for (int var = 0; var < outputQuantity; var++) {
outputStatus[var] = digitalRead(outputAddress[var]);
//Serial.print(outputStatus[var]);
}
}
////////////////////////////////////////////////////////////////////////
//readEepromValues Function
////////////////////////////////////////////////////////////////////////
//Read EEprom values and save to outputStatus
void readEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++) {
outputStatus[adr] = EEPROM.read(adr);
}
}
////////////////////////////////////////////////////////////////////////
//writeEepromValues Function
////////////////////////////////////////////////////////////////////////
//Write EEprom values
void writeEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++) {
EEPROM.write(adr, outputStatus[adr]);
}
}
////////////////////////////////////////////////////////////////////////
//initEepromValues Function
////////////////////////////////////////////////////////////////////////
//Initialiaze EEprom values
// se os valores de eeprom não forem o formato correto, isto é, eu e eu não for igual a 0 ou 1 (assim, maior que 1) inicialize colocando 0
void initEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++){
if (EEPROM.read(adr) > 1){
EEPROM.write(adr, 0);
}
}
}
////////////////////////////////////////////////////////////////////////
//htmlHeader Function
////////////////////////////////////////////////////////////////////////
//Prints html header
void printHtmlHeader(EthernetClient client){
// Serial.print("Serving html Headers at ms -");
timeConnectedAt = millis(); //Record the time when last page was served.
// Serial.print(timeConnectedAt); // Tempo de impressão para fins de debugging
writeToEeprom = true; // página carregada para definir a ação a escrever para eeprom
// envia um cabeçalho de resposta http padrão
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<head>");
// add page title
client.println("<title>AUTOMACAO</title>");
client.println("<meta name=\"description\" content=\"AUTOMACAO RESIDENCIAL\"/>");
// adicione uma meta tag de atualização, para que o navegador seja puxado novamente a cada x segundos:
client.print("<meta http-equiv=\"refresh\" content=\"");
client.print(refreshPage);
client.println("; url=/\">");
// add other browser configuration
client.println("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">");
client.println("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">");
client.println("<meta name=\"viewport\" content=\"width=device-width, user-scalable=no\">");
//inserting the styles data, usually found in CSS files.
client.println("<style type=\"text/css\">");
client.println("");
//This will set how the page will look graphically
client.println("html { height:100%; }");
client.println(" body {");
client.println(" height: 100%;");
client.println(" margin: 0;");
client.println(" font-family: helvetica, sans-serif;");
client.println(" -webkit-text-size-adjust: none;");
client.println(" }");
client.println("");
client.println("body {");
client.println(" -webkit-background-size: 100% 21px;");
client.println(" background-color: #c5ccd3;");
client.println(" background-image:");
client.println(" -webkit-gradient(linear, left top, right top,");
client.println(" color-stop(.75, transparent),");
client.println(" color-stop(.75, rgba(255,255,255,.1)) );");
client.println(" -webkit-background-size: 7px;");
client.println(" }");
client.println("");
client.println(".view {");
client.println(" min-height: 100%;");
client.println(" overflow: auto;");
client.println(" }");
client.println("");
client.println(".header-wrapper {");
client.println(" height: 44px;");
client.println(" font-weight: bold;");
client.println(" text-shadow: rgba(0,0,0,0.7) 0 -1px 0;");
client.println(" border-top: solid 1px rgba(255,255,255,0.6);");
client.println(" border-bottom: solid 1px rgba(0,0,0,0.6);");
client.println(" color: #fff;");
client.println(" background-color: #8195af;");
client.println(" background-image:");
client.println(" -webkit-gradient(linear, left top, left bottom,");
client.println(" from(rgba(255,255,255,.4)),");
client.println(" to(rgba(255,255,255,.05)) ),");
client.println(" -webkit-gradient(linear, left top, left bottom,");
client.println(" from(transparent),");
client.println(" to(rgba(0,0,64,.1)) );");
client.println(" background-repeat: no-repeat;");
client.println(" background-position: top left, bottom left;");
client.println(" -webkit-background-size: 100% 21px, 100% 22px;");
client.println(" -webkit-box-sizing: border-box;");
client.println(" }");
client.println("");
client.println(".header-wrapper h1 {");
client.println(" text-align: center;");
client.println(" font-size: 20px;");
client.println(" line-height: 44px;");
client.println(" margin: 0;");
client.println(" }");
client.println("");
client.println(".group-wrapper {");
client.println(" margin: 9px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h2 {");
client.println(" color: #4c566c;");
client.println(" font-size: 17px;");
client.println(" line-height: 0.8;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #fff 0 1px 0;");
client.println(" margin: 20px 10px 12px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h3 {");
client.println(" color: #4c566c;");
client.println(" font-size: 12px;");
client.println(" line-height: 1;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #fff 0 1px 0;");
client.println(" margin: 20px 10px 12px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h4 {"); //Text for description
client.println(" color: #212121;");
client.println(" font-size: 14px;");
client.println(" line-height: 1;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #aaa 1px 1px 3px;");
client.println(" margin: 5px 5px 5px;");
client.println(" }");
client.println("");
client.println(".group-wrapper table {");
client.println(" background-color: #fff;");
client.println(" -webkit-border-radius: 10px;");
client.println(" -moz-border-radius: 10px;");
client.println(" -khtml-border-radius: 10px;");
client.println(" border-radius: 10px;");
client.println(" font-size: 17px;");
client.println(" line-height: 20px;");
client.println(" margin: 9px 0 20px;");
client.println(" border: solid 1px #a9abae;");
client.println(" padding: 11px 3px 12px 3px;");
client.println(" margin-left:auto;");
client.println(" margin-right:auto;");
client.println(" -moz-transform :scale(1);"); //Code for Mozilla Firefox
client.println(" -moz-transform-origin: 0 0;");
client.println(" }");
client.println("");
//how the green (ON) LED will look
client.println(".green-circle {");
client.println(" display: block;");
client.println(" height: 23px;");
client.println(" width: 23px;");
client.println(" background-color: #0f0;");
//client.println(" background-color: rgba(60, 132, 198, 0.8);");
client.println(" -moz-border-radius: 11px;");
client.println(" -webkit-border-radius: 11px;");
client.println(" -khtml-border-radius: 11px;");
client.println(" border-radius: 11px;");
client.println(" margin-left: 1px;");
client.println(" background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, from(rgba(46, 184, 0, 0.8)), to(rgba(148, 255, 112, .9)));@");
client.println(" border: 2px solid #ccc;");
client.println(" -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;");
client.println(" -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" }");
client.println("");
//how the black (off)LED will look
client.println(".black-circle {");
client.println(" display: block;");
client.println(" height: 23px;");
client.println(" width: 23px;");
client.println(" background-color: #040;");
client.println(" -moz-border-radius: 11px;");
client.println(" -webkit-border-radius: 11px;");
client.println(" -khtml-border-radius: 11px;");
client.println(" border-radius: 11px;");
client.println(" margin-left: 1px;");
client.println(" -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;");
client.println(" -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" }");
client.println("");
//isso irá adicionar o brilho a ambos os LEDs
client.println(" .glare {");
client.println(" position: relative;");
client.println(" top: 1;");
client.println(" left: 5px;");
client.println(" -webkit-border-radius: 10px;");
client.println(" -moz-border-radius: 10px;");
client.println(" -khtml-border-radius: 10px;");
client.println(" border-radius: 10px;");
client.println(" height: 1px;");
client.println(" width: 13px;");
client.println(" padding: 5px 0;");
client.println(" background-color: rgba(200, 200, 200, 0.25);");
client.println(" background-image: -webkit-gradient(linear, 0% 0%, 0% 95%, from(rgba(255, 255, 255, 0.7)), to(rgba(255, 255, 255, 0)));");
client.println(" }");
client.println("");
//e finalmente este é o fim dos dados de estilo e cabeçalho
client.println("</style>");
client.println("</head>");
// agora imprimindo a própria página
client.println("<body>");
client.println("<div class=\"view\">");
client.println(" <div class=\"header-wrapper\">");
client.println(" <h1>ROBERTO CORTES</h1>");
client.println(" </div>");
//////
} //end of htmlHeader
////////////////////////////////////////////////////////////////////////
//htmlFooter Function
////////////////////////////////////////////////////////////////////////
//Prints html footer
void printHtmlFooter(EthernetClient client){
//Set Variables Before Exiting
printLastCommandOnce = false;
printButtonMenuOnce = false;
allOn = "";
allOff = "";
//imprimindo a última parte do html
client.println("\n<h3 align=\"center\">");
client.println(rev);
client.println("</h3></div>\n</div>\n</body>\n</html>");
delay(1); // dê tempo ao navegador da web para receber os dados
client.stop(); // close the connection:
Serial.println(" - Done, Closing Connection.");
delay (2); // demora para dar tempo para que o buffer do cliente seja limpo e não repita várias páginas.
} //end of htmlFooter
////////////////////////////////////////////////////////////////////////
//printHtmlButtonTitle Function
////////////////////////////////////////////////////////////////////////
//Prints html button title
void printHtmlButtonTitle(EthernetClient client){
client.println("<div class=\"group-wrapper\">");
client.println(" <h2></h2>");
client.println();
}
////////////////////////////////////////////////////////////////////////
//printLoginTitle Function
////////////////////////////////////////////////////////////////////////
//Imprime o título do botão html
void printLoginTitle(EthernetClient client){
// client.println("<div class=\"group-wrapper\">");
client.println(" <h2>Please enter the user data to login.</h2>");
client.println();
}…
aperta um botao na maquina 1 aparece no display maquina chamando, isso com 3 maquinas, porem só chama na central, ou seja se nao tiver ninguem por perto ninguem vai ver, gostaria de fazer com que chamasse na central e tambem no celular do tecnico via rede da empresa com app android. e ethernet shild, segue o código que consegui fazer funcionar graças a ajuda de Jose Miguel Fernandes(vlw. amigo). se alguem puder da uma ajuda, nao sei como fazer aplicativo...
SEGUE UM VIDEO EM ANEXO
#include <LiquidCrystal595.h> int luz = 10; int buzzer = 12; int botao = 11; int botao2 = 5; int botao3 = 6; int liberaLcd = true; int liberaLcd2 = true; int liberaLcd3 = true; LiquidCrystal595 lcd(7,8,9); void setup() { lcd.begin(16, 2); pinMode(luz,OUTPUT); pinMode(buzzer,OUTPUT); pinMode(botao,INPUT); pinMode(botao2,INPUT); pinMode(botao3,INPUT); } void loop() { if(digitalRead(botao) == LOW && liberaLcd == true) { delay(100); lcd.setCursor(0,0); lcd.print("ROBO 1"); lcd.setCursor(0,1); lcd.print("CHAMANDO"); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); liberaLcd == true; } if (digitalRead (botao) == HIGH && liberaLcd == true) { delay(100); lcd.clear(); lcd.setCursor(0,0); lcd.print("TUDO"); lcd.setCursor(0,1); lcd.print("BELEZA"); digitalWrite(luz,LOW); liberaLcd == true; } if (digitalRead(botao2) == LOW && liberaLcd2 == true) { delay(100); lcd.setCursor(0,0); lcd.print("ROBO 2"); lcd.setCursor(0,1); lcd.print("CHAMANDO"); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); liberaLcd2 == true; } if (digitalRead (botao2) == HIGH && liberaLcd2 == true) { delay(100); lcd.clear(); lcd.setCursor(0,0); lcd.print("TUDO"); lcd.setCursor(0,1); lcd.print("BELEZA"); digitalWrite(luz,LOW); liberaLcd2 == true; } if(digitalRead(botao3) == LOW && liberaLcd3 == true) { delay(100); lcd.setCursor(0,0); lcd.print("MARLENE"); //marlene é o nome de uma maquina aqui, rsrsr lcd.setCursor(0,1); lcd.print("CHAMANDO"); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); digitalWrite(luz,HIGH); digitalWrite(buzzer,HIGH); delay(500); digitalWrite(luz,LOW); digitalWrite(buzzer,LOW); delay(500); liberaLcd3 == true; } if (digitalRead (botao3) == HIGH && liberaLcd3 == true) { delay(100); lcd.clear(); lcd.setCursor(0,0); lcd.print("TUDO"); lcd.setCursor(0,1); lcd.print("BELEZA!!!"); digitalWrite(luz,LOW); liberaLcd3 == true; } }…
Adicionado por Mateus Cardoso ao 12:36 em 21 fevereiro 2015
////////////////////////
//IP manual settings
byte ip[] = {192, 168, 15, 150 }; //AQUI VC COLOCA SEU IP
byte gateway[] = {192, 168, 15, 1 }; //AQUI VC COLOCA SEU IP
byte subnet[] = {255, 255, 255, 0 }; //AQUI VC COLOCA SEU IP
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//Ethernet Port
EthernetServer server = EthernetServer(80); //default html port 80
//O número de saídas vai ser comutado.
int outputQuantity = 19; //não deve exceder 19
//Inverta a saída dos leds
boolean outputInverted = true; //true or false
// Isso é feito no caso a placa de relé acionar o relé em negativo, ao invés de positivo//Html page refresh
int refreshPage = 40; //default is 50sec.
//Tenha em atenção que, se conseguir que a atualização seja muito rápida, a página pode ficar inacessível
//Exibir ou ocultar os botões "Ativar todos os pinos" na parte inferior da página
int switchOnAllPinsButton = true; //true or false
int outputAddress[19] = {22,24,26,28,30,32,34,36,38,40,42,44,46,48,49,47,43,41,45}; //Nenhum cliente por mais de um minuto - Escrevendo status para Eprom 22,24,26,28,30,32,34,36,38,40,42,44,46,48,49,47,43,41,45
String buttonText[19] = {
"01.CORREDOR RUIVA","02.VENTILADOR RUIVA","03.RUIVA","04.FRENTE/FUNDOS","05.FRENTE","06.PORTAO FRENTE","07.LATERAL","08.VARANDA","09.SNOW","10.CHURRASQUEIRA","11.PORTAO GARAGEM","12.ALEMAO","13.CAIXA D'AGUA","14.ESCRITORIO","15.AREA","16.LIVRE","17.LIVRE","18.LIVRE","19.COMANDO GERAL"};
// Defina a saída para manter o último status após a falta de energia.
int retainOutputStatus[19] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//1-reter o último status. 0-será desligado após o corte de energia.
////////////////////////////////////////////////////////////////////////
//VARIABLES DECLARATION
////////////////////////////////////////////////////////////////////////
int outp = 0;
boolean printLastCommandOnce = false;
boolean printButtonMenuOnce = false;
boolean initialPrint = true;
String allOn = "";
String allOff = "";
boolean reading = false;
boolean outputStatus[19]; //Crie uma matriz booleana para a quantidade máxima.
String rev = "";
unsigned long timeConnectedAt;
boolean writeToEeprom = false;
/////////////////////////////////////////////////
// Leitura Relacionada à Temperatura
const int tempInPin = A1;
int tempInValue = 0; //leitura de temperatura
int tempScaleOutValue = 0; //temperatura formatada
int tempOutValue = 0; //temperatura formatada
float tempOutDeg = 0.0;
////////////////////////////////////////////////////////////////////////
//RUN ONCE
////////////////////////////////////////////////////////////////////////
//Beginning of Program //Sensor de presença
int pinoled1 = 8; //Pino ligado ao led vermelhoint pinoled2 = 9; //Pino ligado ao led amareloint pinoled3 = 19; //Pino ligado ao led verdeint pinoled4 = 10; //Pino ligado ao led azul
int pinopir1 = 2; //Pino ligado ao sensor PIRint pinopir2 = 3; //Pino ligado ao sensor PIRint pinopir3 = 4; //Pino ligado ao sensor PIRint pinopir4 = 5; //Pino ligado ao sensor PIRint acionamento; //Variavel para guardar valor do sensor
void setup(){
Serial.begin(9600);
initEepromValues();
readEepromValues();
//Set pins as Outputs
boolean currentState = false;
int var;
for (int i = 0; i < outputQuantity; i++){ pinMode(pinoled1, OUTPUT); //Define pino como saida pinMode(pinopir1, INPUT); //Define pino sensor como entrada
pinMode(pinoled2, OUTPUT); //Define pino como saida pinMode(pinopir2, INPUT); //Define pino sensor como entrada
pinMode(pinoled3, OUTPUT); //Define pino como saida pinMode(pinopir3, INPUT); //Define pino sensor como entrada
pinMode(pinoled4, OUTPUT); //Define pino como saida pinMode(pinopir4, INPUT); //Define pino sensor como entrada
pinMode(outputAddress[i], OUTPUT);
var = outputAddress[i];
//Aciona todas as saídas para ligado ou desligado na inicialização (true ou false)
if(outputInverted == false) {
//digitalWrite(outputAddress[var], LOW);
if(outputStatus[i] == 0){currentState = true;}else{currentState = false;} //verifique o status da saída se desligado, comute a saída em conformidadedigitalWrite(var, currentState);
}
else{
//digitalWrite(outputAddress[var], LOW);
if(outputStatus[i] == 0){currentState = false;}else{currentState = true;} //verifique o status da saída se desligado, comute a saída em conformidade
digitalWrite(var, currentState);
}
}
//Setting up the IP address. Comment out the one you dont need.
//Ethernet.begin(mac); //for DHCP address. (Address will be printed to serial.)
Ethernet.begin(mac, ip, gateway, subnet); //for manual setup. (Address is the one configured above.)
server.begin();
Serial.print("Server started at ");
Serial.println(Ethernet.localIP());
}
////////////////////////////////////////////////////////////////////////
//LOOP
////////////////////////////////////////////////////////////////////////
//Run once
void loop(){
acionamento = digitalRead(pinopir1); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled1, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled1, HIGH); }
acionamento = digitalRead(pinopir2); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled2, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled2, HIGH);}
acionamento = digitalRead(pinopir3); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled3, LOW); } else //Caso seja detectado um movimento, aciona o led vermelho { digitalWrite(pinoled3, HIGH); } acionamento = digitalRead(pinopir4); //Le o valor do sensor PIR if (acionamento == LOW) //Sem movimento, mantem led azul ligado { digitalWrite(pinoled4, LOW); } else //Caso seja detectado um movimento, aciona o led azul { digitalWrite(pinoled4, HIGH); }
//Read Temperature Sensor
tempInValue = analogRead(tempInPin);
// Connecting a 10K3 Thermistor to the Arduino Input
// +5V �—————————[10Kohms]—————————[Thermistor]——� 0V
// To Arduino IP �———————————|
tempScaleOutValue = map(tempInValue, 0, 1023, 1023, 0); //Arduino value and NTC of the 10K3 Thermistor
tempOutValue = map(tempScaleOutValue, 130, 870, -170, 730); //range of Arduino Value compared with Temperature
tempOutValue = tempOutValue -45; //Adjustments
tempOutDeg = tempOutValue / 10.0;
checkForClient();
}
////////////////////////////////////////////////////////////////////////
//checkForClient Function
////////////////////////////////////////////////////////////////////////
//
void checkForClient(){
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
boolean sentHeader = false;
int temp,temp1;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if(c == '*'){
printHtmlHeader(client); //call for html header and css
printLoginTitle(client);
printHtmlFooter(client);
break;
}
if(!sentHeader){
printHtmlHeader(client); //call for html header and css
printHtmlButtonTitle(client); //print the button title
sentHeader = true;
}
if(reading && c == ' '){
reading = false;
}
if(c == '?') {
reading = true; //found the ?, begin reading the info
}
if(reading){
//if user input is H set output to 1
if(c == 'H') {
outp = 1;
}
if(c == 'L') {
outp = 0;
}
// Serial.println(c); //print the value of c to serial communication
//---------------------------------------------------------------------------------------------
// ? H 1 0
// ^ ^ ^ ^
// | | | |____________read 4 ( 10,11,12,13....)
// | | |______________read 3 ( 1....9)
// | |________________read 2 if user input is H set output to L
// |__________________read 1
//---------------------------------------------------------------------------------------------
if( c == '1'){
char c = client.read();
switch (c) {
case '0':
triggerPin(outputAddress[10], client, outp);
break;
case '1':
triggerPin(outputAddress[11], client, outp);
break;
case '2':
triggerPin(outputAddress[12], client, outp);
break;
case '3':
triggerPin(outputAddress[13], client, outp);
break;
case '4':
triggerPin(outputAddress[14], client, outp);
break;
case '5':
triggerPin(outputAddress[15], client, outp);
break;
case '6':
triggerPin(outputAddress[16], client, outp);
break;
case '7':
triggerPin(outputAddress[17], client, outp);
break;
case '8':
triggerPin(outputAddress[18], client, outp);
break;
case '9':
triggerPin(outputAddress[19], client, outp);
break;
default:
char c = client.read();
triggerPin(outputAddress[1], client, outp);
}
}
else {
switch (c) {
case '0':
triggerPin(outputAddress[0], client, outp);
//break;
//case '1':
//triggerPin(outputAddress[1], client, outp);
break;
case '2':
triggerPin(outputAddress[2], client, outp);
break;
case '3':
//add code here to trigger on 3
triggerPin(outputAddress[3], client, outp);
break;
case '4':
//add code here to trigger on 4
triggerPin(outputAddress[4], client, outp);
break;
case '5':
//add code here to trigger on 5
triggerPin(outputAddress[5], client, outp);
//printHtml(client);
break;
case '6':
//add code here to trigger on 6
triggerPin(outputAddress[6], client, outp);
break;
case '7':
//add code here to trigger on 7
triggerPin(outputAddress[7], client, outp);
break;
case '8':
//add code here to trigger on 8
triggerPin(outputAddress[8], client, outp);
break;
case '9':
//add code here to trigger on 9
triggerPin(outputAddress[9], client, outp);
break;
} //end of switch case
}
}//end of switch switch the relevant output
//if user input was blank
if (c == '\n' && currentLineIsBlank){
printLastCommandOnce = true;
printButtonMenuOnce = true;
triggerPin(777, client, outp); //Call to read input and print menu. 777 is used not to update any outputs
break;
}
}
}
printHtmlFooter(client); //Prints the html footer
}
else{
if (millis() > (timeConnectedAt + 60000)){
if (writeToEeprom == true){
writeEepromValues(); //write to EEprom the current output statuses
Serial.println("No Clients for more then a minute - Writing statuses to Eeprom.");
writeToEeprom = false;
}
}
}
}// END
////////////////////////////////////////////////////////////////////////
//triggerPin Function
////////////////////////////////////////////////////////////////////////
//
void triggerPin(int pin, EthernetClient client, int outp){
if (pin != 777){
// Serial.println(pin);
if(outp == 1) {
if (outputInverted ==false){
digitalWrite(pin, HIGH);
}
else{
digitalWrite(pin, LOW);
}
}
if(outp == 0){
if (outputInverted ==false){
digitalWrite(pin, LOW);
}
else{
digitalWrite(pin, HIGH);
}
}
}
//Refresh the reading of outputs
readOutputStatuses();
//Prints the buttons
if (printButtonMenuOnce == true){
printHtmlButtons(client);
printButtonMenuOnce = false;
}
}
////////////////////////////////////////////////////////////////////////
//printHtmlButtons Function
////////////////////////////////////////////////////////////////////////
//print the html buttons to switch on/off channels
void printHtmlButtons(EthernetClient client){
//Start to create the html table
client.println("");
//client.println("<p>");
client.println("<FORM>");
client.println("<table border=\"0\" align=\"center\">");
//Printing the Temperature
client.print("<tr>\n");
client.print("<td><h4>");
client.print("Temperature");
client.print("</h4></td>\n");
client.print("<td></td>");
client.print("<td>");
client.print("<h3>");
client.print(tempOutDeg);
client.print(" °C</h3></td>\n");
client.print("<td></td>");
client.print("</tr>");
//Start printing button by button
for (int var = 0; var < outputQuantity; var++) {
//set command for all on/off
allOn += "H";
allOn += outputAddress[var];
allOff += "L";
allOff += outputAddress[var];
//Print begining of row
client.print("<tr>\n");
//Prints the button Text
client.print("<td><h4>");
client.print(buttonText[var]);
client.print("</h4></td>\n");
//Prints the ON Buttons+++++++++++++++++++++++++++++++++++++++++++++++
client.print("<td>");
client.print("<INPUT TYPE=\"button\" VALUE=\"ON ");
client.print("\" onClick=\"parent.location='/?H");
client.print(var);
client.print("'\"></td>\n");
//Prints the OFF Buttons ---------------------------------------------
client.print(" <td><INPUT TYPE=\"button\" VALUE=\"OFF");
client.print("\" onClick=\"parent.location='/?L");
client.print(var);
client.print("'\"></td>\n");
//Invert the LED display if output is inverted.
if (outputStatus[var] == true ){ //If Output is ON
if (outputInverted == false){ //and if output is not inverted
client.print(" <td><div class='green-circle'><div class='glare'></div></div></td>\n"); //Print html for ON LED
}
else{ //else output is inverted then
client.print(" <td><div class='black-circle'><div class='glare'></div></div></td>\n"); //Print html for OFF LED
}
}
else //If Output is Off
{
if (outputInverted == false){ //and if output is not inverted
client.print(" <td><div class='black-circle'><div class='glare'></div></div></td>\n"); //Print html for OFF LED
}
else{ //else output is inverted then
client.print(" <td><div class='green-circle'><div class='glare'></div></div></td>\n"); //Print html for ON LED
}
}
//Print end of row
client.print("</tr>\n");
}
//Display or hide the Print all on Pins Button
if (switchOnAllPinsButton == true ){
//Prints the ON All Pins Button
client.print("<tr>\n<td><INPUT TYPE=\"button\" VALUE=\"ON");
client.print("\" onClick=\"parent.location='/?");
client.print(allOn);
client.print("'\"></td>\n");
//Prints the OFF All Pins Button
client.print("<td><INPUT TYPE=\"button\" VALUE=\"OFF");
client.print("\" onClick=\"parent.location='/?");
client.print(allOff);
client.print("'\"></td>\n<td></td>\n<td></td>\n</tr>\n");
}
//Closing the table and form
client.println("</table>");
client.println("</FORM>");
//client.println("</p>");
}
////////////////////////////////////////////////////////////////////////
//readOutputStatuses Function
////////////////////////////////////////////////////////////////////////
//Reading the Output Statuses
void readOutputStatuses(){
for (int var = 0; var < outputQuantity; var++) {
outputStatus[var] = digitalRead(outputAddress[var]);
//Serial.print(outputStatus[var]);
}
}
////////////////////////////////////////////////////////////////////////
//readEepromValues Function
////////////////////////////////////////////////////////////////////////
//Read EEprom values and save to outputStatus
void readEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++) {
outputStatus[adr] = EEPROM.read(adr);
}
}
////////////////////////////////////////////////////////////////////////
//writeEepromValues Function
////////////////////////////////////////////////////////////////////////
//Write EEprom values
void writeEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++) {
EEPROM.write(adr, outputStatus[adr]);
}
}
////////////////////////////////////////////////////////////////////////
//initEepromValues Function
////////////////////////////////////////////////////////////////////////
//Initialiaze EEprom values
//if eeprom values are not the correct format ie not euqual to 0 or 1 (thus greater then 1) initialize by putting 0
void initEepromValues(){
for (int adr = 0; adr < outputQuantity; adr++){
if (EEPROM.read(adr) > 1){
EEPROM.write(adr, 0);
}
}
}
////////////////////////////////////////////////////////////////////////
//htmlHeader Function
////////////////////////////////////////////////////////////////////////
//Prints html header
void printHtmlHeader(EthernetClient client){
// Serial.print("Serving html Headers at ms -");
timeConnectedAt = millis(); //Record the time when last page was served.
// Serial.print(timeConnectedAt); // Print time for debbugging purposes
writeToEeprom = true; // page loaded so set to action the write to eeprom
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<head>");
// add page title
client.println("<title>Painel</title>");
client.println("<meta name=\"description\" content=\"CORTES\"/>");
// add a meta refresh tag, so the browser pulls again every x seconds:
client.print("<meta http-equiv=\"refresh\" content=\"");
client.print(refreshPage);
client.println("; url=/\">");
// add other browser configuration
client.println("<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">");
client.println("<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"default\">");
client.println("<meta name=\"viewport\" content=\"width=device-width, user-scalable=no\">");
//inserting the styles data, usually found in CSS files.
client.println("<style type=\"text/css\">");
client.println("");
//This will set how the page will look graphically
client.println("html { height:100%; }");
client.println(" body {");
client.println(" height: 100%;");
client.println(" margin: 0;");
client.println(" font-family: helvetica, sans-serif;");
client.println(" -webkit-text-size-adjust: none;");
client.println(" }");
client.println("");
client.println("body {");
client.println(" -webkit-background-size: 100% 21px;");
client.println(" background-color: #c5ccd3;");
client.println(" background-image:");
client.println(" -webkit-gradient(linear, left top, right top,");
client.println(" color-stop(.75, transparent),");
client.println(" color-stop(.75, rgba(255,255,255,.1)) );");
client.println(" -webkit-background-size: 7px;");
client.println(" }");
client.println("");
client.println(".view {");
client.println(" min-height: 100%;");
client.println(" overflow: auto;");
client.println(" }");
client.println("");
client.println(".header-wrapper {");
client.println(" height: 44px;");
client.println(" font-weight: bold;");
client.println(" text-shadow: rgba(0,0,0,0.7) 0 -1px 0;");
client.println(" border-top: solid 1px rgba(255,255,255,0.6);");
client.println(" border-bottom: solid 1px rgba(0,0,0,0.6);");
client.println(" color: #fff;");
client.println(" background-color: #8195af;");
client.println(" background-image:");
client.println(" -webkit-gradient(linear, left top, left bottom,");
client.println(" from(rgba(255,255,255,.4)),");
client.println(" to(rgba(255,255,255,.05)) ),");
client.println(" -webkit-gradient(linear, left top, left bottom,");
client.println(" from(transparent),");
client.println(" to(rgba(0,0,64,.1)) );");
client.println(" background-repeat: no-repeat;");
client.println(" background-position: top left, bottom left;");
client.println(" -webkit-background-size: 100% 21px, 100% 22px;");
client.println(" -webkit-box-sizing: border-box;");
client.println(" }");
client.println("");
client.println(".header-wrapper h1 {");
client.println(" text-align: center;");
client.println(" font-size: 20px;");
client.println(" line-height: 44px;");
client.println(" margin: 0;");
client.println(" }");
client.println("");
client.println(".group-wrapper {");
client.println(" margin: 9px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h2 {");
client.println(" color: #4c566c;");
client.println(" font-size: 17px;");
client.println(" line-height: 0.8;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #fff 0 1px 0;");
client.println(" margin: 20px 10px 12px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h3 {");
client.println(" color: #4c566c;");
client.println(" font-size: 12px;");
client.println(" line-height: 1;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #fff 0 1px 0;");
client.println(" margin: 20px 10px 12px;");
client.println(" }");
client.println("");
client.println(".group-wrapper h4 {"); //Text for description
client.println(" color: #212121;");
client.println(" font-size: 14px;");
client.println(" line-height: 1;");
client.println(" font-weight: bold;");
client.println(" text-shadow: #aaa 1px 1px 3px;");
client.println(" margin: 5px 5px 5px;");
client.println(" }");
client.println("");
client.println(".group-wrapper table {");
client.println(" background-color: #fff;");
client.println(" -webkit-border-radius: 10px;");
client.println(" -moz-border-radius: 10px;");
client.println(" -khtml-border-radius: 10px;");
client.println(" border-radius: 10px;");
client.println(" font-size: 17px;");
client.println(" line-height: 20px;");
client.println(" margin: 9px 0 20px;");
client.println(" border: solid 1px #a9abae;");
client.println(" padding: 11px 3px 12px 3px;");
client.println(" margin-left:auto;");
client.println(" margin-right:auto;");
client.println(" -moz-transform :scale(1);"); //Code for Mozilla Firefox
client.println(" -moz-transform-origin: 0 0;");
client.println(" }");
client.println("");
//how the green (ON) LED will look
client.println(".green-circle {");
client.println(" display: block;");
client.println(" height: 23px;");
client.println(" width: 23px;");
client.println(" background-color: #0f0;");
//client.println(" background-color: rgba(60, 132, 198, 0.8);");
client.println(" -moz-border-radius: 11px;");
client.println(" -webkit-border-radius: 11px;");
client.println(" -khtml-border-radius: 11px;");
client.println(" border-radius: 11px;");
client.println(" margin-left: 1px;");
client.println(" background-image: -webkit-gradient(linear, 0% 0%, 0% 90%, from(rgba(46, 184, 0, 0.8)), to(rgba(148, 255, 112, .9)));@");
client.println(" border: 2px solid #ccc;");
client.println(" -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;");
client.println(" -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" }");
client.println("");
//how the black (off)LED will look
client.println(".black-circle {");
client.println(" display: block;");
client.println(" height: 23px;");
client.println(" width: 23px;");
client.println(" background-color: #040;");
client.println(" -moz-border-radius: 11px;");
client.println(" -webkit-border-radius: 11px;");
client.println(" -khtml-border-radius: 11px;");
client.println(" border-radius: 11px;");
client.println(" margin-left: 1px;");
client.println(" -webkit-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px;");
client.println(" -moz-box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" box-shadow: rgba(11, 140, 27, 0.5) 0px 10px 16px; /* FF 3.5+ */");
client.println(" }");
client.println("");
//this will add the glare to both of the LEDs
client.println(" .glare {");
client.println(" position: relative;");
client.println(" top: 1;");
client.println(" left: 5px;");
client.println(" -webkit-border-radius: 10px;");
client.println(" -moz-border-radius: 10px;");
client.println(" -khtml-border-radius: 10px;");
client.println(" border-radius: 10px;");
client.println(" height: 1px;");
client.println(" width: 13px;");
client.println(" padding: 5px 0;");
client.println(" background-color: rgba(200, 200, 200, 0.25);");
client.println(" background-image: -webkit-gradient(linear, 0% 0%, 0% 95%, from(rgba(255, 255, 255, 0.7)), to(rgba(255, 255, 255, 0)));");
client.println(" }");
client.println("");
//and finally this is the end of the style data and header
client.println("</style>");
client.println("</head>");
//now printing the page itself
client.println("<body>");
client.println("<div class=\"view\">");
client.println(" <div class=\"header-wrapper\">");
client.println(" <h1>AUTOMACAO</h1>");
client.println(" </div>");
//////
} //end of htmlHeader
////////////////////////////////////////////////////////////////////////
//htmlFooter Function
////////////////////////////////////////////////////////////////////////
//Prints html footer
void printHtmlFooter(EthernetClient client){
//Set Variables Before Exiting
printLastCommandOnce = false;
printButtonMenuOnce = false;
allOn = "";
allOff = "";
//printing last part of the html
client.println("\n<h3 align=\"center\">ROBERTO CORTES");
client.println(rev);
client.println("</h3></div>\n</div>\n</body>\n</html>");
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection:
Serial.println(" - Done, Closing Connection.");
delay (2); //delay so that it will give time for client buffer to clear and does not repeat multiple pages.
} //end of htmlFooter
////////////////////////////////////////////////////////////////////////
//printHtmlButtonTitle Function
////////////////////////////////////////////////////////////////////////
//Prints html button title
void printHtmlButtonTitle(EthernetClient client){
client.println("<div class=\"group-wrapper\">");
client.println(" <h2></h2>");
client.println();
}
////////////////////////////////////////////////////////////////////////
//printLoginTitle Function
////////////////////////////////////////////////////////////////////////
//Prints html button title
void printLoginTitle(EthernetClient client){
// client.println("<div class=\"group-wrapper\">");
client.println(" <h2>Please enter the user data to login.</h2>");
client.println();
}…
ois botões físicos e por isso apenas um botão do interruptor estava funcionando. Após achar o erro no código eu tentei carregá-lo novamente para o ESp32, porém, sempre dá erro .
Eu compilo normalmente o Sketch, mas,na hora de carregar pro ESP fica dando erro.
Vou postar aqui o código q utilizei e a mensagem de erro.
___________________________________________________________________________________________________
#include <WiFi.h>#include <WiFiClient.h>#include <BlynkSimpleEsp32.h>// Você deve obter o Auth Token na aplicação Blynk.// Vá para Configurações do Projeto (ícone da porca).char auth[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Token Gerado pelo Blynk. // Your WiFi credentials.// Defina a senha para "" para redes abertas.char ssid[] = "Guga_Tampa";char pass[] = "XXXXXXXXXX";// Defina seu LED e pinos de botão físico aquiconst int ledPin = 12;const int ledPin2 = 14;const int ledPin3 = 27;const int btnPin = 2;const int btnPin2 = 4;const int btnPin3 = 16;BlynkTimer timer;void checkPhysicalButton();int ledState = LOW;int btnState = HIGH;int ledState2 = LOW;int btnState2 = HIGH;int ledState3 = LOW;int btnState3 = HIGH;// Toda vez que nos conectamos à nuvem ...BLYNK_CONNECTED() { // Solicite o estado mais recente do servidor Blynk.syncVirtual(V2); Blynk.syncVirtual(V3); Blynk.syncVirtual(V4); // Alternativamente, você pode substituir o estado do servidor usando: //Blynk.virtualWrite(V2, ledState);}// Quando o botão do App for pressionado - irá mudar o estadoBLYNK_WRITE(V2) { ledState = param.asInt(); digitalWrite(ledPin, ledState);}BLYNK_WRITE(V3) { ledState2 = param.asInt(); digitalWrite(ledPin2, ledState2);}BLYNK_WRITE(V4) { ledState3 = param.asInt(); digitalWrite(ledPin3, ledState3);}void checkPhysicalButton(){ if (digitalRead(btnPin) == LOW) { // btnState é usado para evitar alternar sequencialmente if (btnState != LOW) { // Alternar estado do LED ledState = !ledState; digitalWrite(ledPin, ledState); // Widget botão de atualização Blynk.virtualWrite(V2, ledState); } btnState = LOW; } else { btnState = HIGH; } if (digitalRead(btnPin2) == LOW) { // btnState é usado para evitar alternar sequencialmente if (btnState2 != LOW) { // Alternar estado do LED ledState2 = !ledState2; digitalWrite(ledPin2, ledState2); // Widget botão de atualização Blynk.virtualWrite(V3, ledState2); } btnState2 = LOW; } else { btnState2 = HIGH; } if (digitalRead(btnPin3) == LOW) { // btnState é usado para evitar alternar sequencialmente if (btnState3 != LOW) { // Alternar estado do LED ledState3 = !ledState3; digitalWrite(ledPin3, ledState3); // Widget botão de atualização Blynk.virtualWrite(V4, ledState3); } btnState3 = LOW; } else { btnState3 = HIGH; } }void setup(){ // Console de depuração Serial.begin(9600); Blynk.begin(auth, ssid, pass); // Você também pode especificar o servidor: //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442); //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442); pinMode(ledPin, OUTPUT); pinMode(btnPin, INPUT_PULLUP); pinMode(ledPin2, OUTPUT); pinMode(btnPin2, INPUT_PULLUP); pinMode(ledPin3, OUTPUT); pinMode(btnPin3, INPUT_PULLUP); digitalWrite(ledPin, ledState); digitalWrite(ledPin2, ledState2); digitalWrite(ledPin3, ledState3); // Configure uma função a ser chamada a cada 100 ms timer.setInterval(100L, checkPhysicalButton);}void loop(){ Blynk.run(); timer.run();}
___________________________________________________________________________________________________
Mensagem do erro:
Arduino: 1.8.4 (Windows 10), Placa:"ESP32 Dev Module, QIO, 80MHz, 4MB (32Mb), 921600, None"Opções de compilação alteradas, recompilando tudoO sketch usa 455819 bytes (34%) de espaço de armazenamento para programas. O máximo são 1310720 bytes.Variáveis globais usam 35304 bytes (11%) de memória dinâmica, deixando 259608 bytes para variáveis locais. O máximo são 294912 bytes.esptool.py v2.1-beta1Connecting........___Chip is ESP32D0WDQ6 (revision 0)Uploading stub...Running stub...Stub running...Changing baud rate to 921600Changed.Configuring flash size...Warning: Could not auto-detect Flash size (FlashID=0xffffff, SizeID=0xff), defaulting to 4MBCompressed 8192 bytes to 47...A fatal error occurred: Timed out waiting for packet contentA fatal error occurred: Timed out waiting for packet contentEste relatório teria mais informações com"Mostrar a saida detalhada durante a compilação"opção pode ser ativada em "Arquivo -> Preferências"
________________________________________________________________________________________________
Alguém sabe como posso resolver isto ?
Desde já obrigado.
…
culadoras com arduino que totalizam e já mostram o codigo. Isso interessa para o comerciante.
Já tive duas. Uma comprada, com mensalidade e uma sem mensalidade (prefiro não fazer propaganda).Existem ao menos 3 cobranças:1) Custo da máquina (uma vez, na aquisição);2) Custo mensal (taxa);
3) Custo por transação (%).
Elas variam de uma pra outra.
Pra quem praticamente não usa, melhor a sem taxa mensal.
Pra quem usa mto, melhor a com taxa mensal, pq elas tem, ou deveriam ter, os menores custos por transação.
Ou seja: A resposta precisa ser adaptada ao seu negócio, impossível responder com precisão sem mais detalhes, além de que aqui não sei se temos especialistas.
As maquininhas "grátis" podem ser as piores, pq tem as maiores taxas... Importante ter em mente: "Grátis não existe."
O "eixo da terra" nesse setor está prestes a mudar. Convém não investir nisso... Isso favorece as "grátis", pq vc não vai gastar mto com ela para ter agora.
Digo: Em breve o pix deverá dominar boa parte do mercado, mas não todo!
O PIX substitui com vantagem o TED e o DOC, mas não substitui o cartão de crédito (urgh!). Eu não gosto de cartões de crédito (é pessoal) mas tem gente que ama. Não deixará de usar. Para essas apenas a maquininha mesmo.
Acredito que no futuro teremos maquininhas com LCD que permitem criar um QRCode customizado para cada venda, assim vc paga com pix.
Antes dela vc terá um adesivo com o QRCode contendo só a conta, vc digita o valor copiado do visor da calculadora (caixa) do estabelecimento.
Isso é comum hoje por ex na China.Lá existe apenas um banco (Bank of China), por isso toda transação é uma transferencia comum. Aih eles colocam o QRCode por ex num dos baldes da floricultura, vc aponta pro balde e digita o valor. Simples assim. Não existem cartões de credito lá. Não há credito ou parcelamento. Tudo pago a dinheiro, à vista, ou em contratos ou app do banco. Não existe um "ou 12x 99,90" nas vitrines. As vezes elas nem mostram os preços. Eles são definidos pela cara do freguês. Veja como funciona em:https://www.youtube.com/watch?v=l3z-Z7p5RCk
Existem outros métodos como pagar com o rosto:https://www.youtube.com/watch?v=tWmpnqsDZ-M
Mas creio que não seja mto mais que sacar com o dedo, já possível no Itau e Bradesco. Vc digita o numero da conta e coloca o dedo/mão. Então a biometria é conferir se é a pessoa mesmo. Procurar a pessoa dentro de um banco de dados com todos os correntistas, como é feito em um episódio de Black Mirror (recomendo) ainda não dá.Como dizia Jobs, devemos olhar para as beiradas... Ou vcs acham que o PIX é coisa de brasileiro ???Em breve teremos o PIX internacional tb... Aih alem de não importar mais o banco não vai mais importar a moeda. Aih é o fim...
Mas enquanto existir o cartão de credito temo que a maquininha seja necessária.
Existia uma lei, claro, criada pelos inimigos do comercio=operadoras de cartão, que proibia que se de desconto conforme a forma de pagamento. Claro, eles chamam isso de acréscimo para pagamento em cartão. Essa lei caiu em 2016.Massssss, é claro, como lembrado pelo colega, o UOL, A Globo, toda a mídia, todo isso que compõe o "consórcio de veículos de imprensa" não vai te informar. Quer que vc não tenha descontos... Por isso acho importante informar os colegas.
Ref:https://idec.org.br/consultas/dicas-e-direitos/preco-diferenciado-n...
http://www.procon.pr.gov.br/modules/conteudo/conteudo.php?conteudo=299
…
Adicionado por Eduardo ao 17:04 em 21 novembro 2020