Resultados da busca - %E6%81%92%E8%BE%BE%E5%A8%B1%E4%B9%9021960%E4%BB%A3%E7%90%86%E3%80%90%E2%94%8B%E5%B8%82%E5%9C%BA%E9%83%A82%E2%92%8F7%E2%92%8F01705%5B%E6%89%A3%5D%E3%80%93%E3%80%91
er_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:189:105: error: conflicting declaration of C function 'void* malloc(size_t, const char*, int)'
void *pvPortMalloc(size_t xWantedSize, const char* file, int line) __attribute__((malloc, alloc_size(1)));
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/stdio.h:29:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:27,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/stdlib.h:101:21: note: previous declaration 'void* malloc(size_t)'
_PTR _EXFUN_NOTHROW(malloc,(size_t __size));
^
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/_ansi.h:64:37: note: in definition of macro '_EXFUN_NOTHROW'
#define _EXFUN_NOTHROW(name, proto) name proto _NOTHROW
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:191:53: error: conflicting declaration of C function 'void free(void*, const char*, int)'
void vPortFree(void *ptr, const char* file, int line);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/stdio.h:29:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:27,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/stdlib.h:90:22: note: previous declaration 'void free(void*)'
_VOID _EXFUN_NOTHROW(free,(_PTR));
^
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/newlib/_ansi.h:64:37: note: in definition of macro '_EXFUN_NOTHROW'
#define _EXFUN_NOTHROW(name, proto) name proto _NOTHROW
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:207:37: error: conflicting declaration of C function 'void ets_install_putc1(void*)'
void ets_install_putc1(void* routine);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOSConfig.h:120:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:99,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/ets_sys.h:242:6: note: previous declaration 'void ets_install_putc1(void (*)(char))'
void ets_install_putc1(void (*p)(char c));
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:208:27: error: conflicting declaration of C function 'void ets_isr_mask(int)'
void ets_isr_mask(int intr);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOSConfig.h:120:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:99,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/ets_sys.h:477:6: note: previous declaration 'void ets_isr_mask(uint32_t)'
void ets_isr_mask(uint32_t mask);
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:209:29: error: conflicting declaration of C function 'void ets_isr_unmask(int)'
void ets_isr_unmask(int intr);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOSConfig.h:120:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:99,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/ets_sys.h:488:6: note: previous declaration 'void ets_isr_unmask(uint32_t)'
void ets_isr_unmask(uint32_t unmask);
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:216:68: error: conflicting declaration of C function 'bool ets_task(ETSTask, uint8, ETSEvent*, uint8)'
bool ets_task(ETSTask task, uint8 prio, ETSEvent *queue, uint8 qlen);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOSConfig.h:120:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:99,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/ets_sys.h:105:6: note: previous declaration 'void ets_task(ETSTask, uint8_t, ETSEvent*, uint8_t)'
void ets_task(ETSTask task, uint8_t prio, ETSEvent *queue, uint8_t qlen);
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/os_type.h:28:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:28,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ets_sys.h:217:54: error: conflicting declaration of C function 'bool ets_post(uint8, ETSSignal, ETSParam)'
bool ets_post(uint8 prio, ETSSignal sig, ETSParam par);
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOSConfig.h:120:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:99,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/ets_sys.h:119:12: note: previous declaration 'ETS_STATUS ets_post(uint8_t, ETSSignal, ETSParam)'
ETS_STATUS ets_post(uint8_t prio, ETSSignal sig, ETSParam par);
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:38:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/gpio.h:40:29: error: redeclaration of 'GPIO_PIN_INTR_DISABLE'
GPIO_PIN_INTR_DISABLE = 0,
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/driver/driver/gpio.h:24:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_sleep.h:19,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_system.h:21,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/portable.h:126,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:105,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/gpio.h:52:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_DISABLE'
GPIO_PIN_INTR_DISABLE = 0,
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:38:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/gpio.h:41:29: error: redeclaration of 'GPIO_PIN_INTR_POSEDGE'
GPIO_PIN_INTR_POSEDGE = 1,
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/driver/driver/gpio.h:24:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_sleep.h:19,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_system.h:21,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/portable.h:126,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:105,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/gpio.h:53:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_POSEDGE'
GPIO_PIN_INTR_POSEDGE = 1,
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:38:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/gpio.h:42:29: error: redeclaration of 'GPIO_PIN_INTR_NEGEDGE'
GPIO_PIN_INTR_NEGEDGE = 2,
^
In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/driver/driver/gpio.h:24:0,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_sleep.h:19,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_system.h:21,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/portable.h:126,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/freertos/freertos/FreeRTOS.h:105,
from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:32,
from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:
C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/rom/gpio.h:54:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_NEGEDGE'
GPIO_PIN_INTR_NEGEDGE = 2,
^
In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/user_interface.h:38:0,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29,
from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:34,
from K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino:23:
C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/gpio.h:43:29: error: redeclaration of 'GPIO_PIN_INTR_ANYEDGE'
GPIO_PIN_INTR_ANYEDGE = 3,
^…
individuais, mas não sei como relacioná-los. Vocês sabem de alguém que possa me ajudar?
Aqui está a programação do RFID
Penso que no final basta substituir o "LIGAR DO LED POR TOCAR O MP3", mas não sei como fazer..
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); }
void loop () { byte code[6]; byte old_code[5] = {106, 0, 62, 77, 91}; byte checksum = 0; byte tempbyte = 0;
if (Serial.available() > 0) { byte val = Serial.read(); if (val == 2) { byte bytesread = 0; while (bytesread < 12) { if (Serial.available() > 0) { val = Serial.read(); if (val == 0x0D || val == 0x0A || val == 0x03 || val == 0x02) break; if (val >= '0' && val <= '9') val = val - '0'; else if (val >= 'A' && val <= 'F') val = 10 + val - 'A'; if (bytesread & 1 == 1) { code[bytesread >> 1] = val | (tempbyte << 4); if (bytesread >> 1 != 5) checksum ^= code[bytesread >> 1]; } else tempbyte = val; bytesread++; } } if (bytesread == 12 && code[5] == checksum) { for (int i = 0; i < 5; i++) { Serial.print(code[i]); } boolean error = false; for (int j = 0; j < 5; j++) { if (code[j] != old_code[j]) error = true; } if (!error) { Serial.println("TAG correta!!!"); digitalWrite(13, HIGH); } else { Serial.println("TAG errada!!!"); digitalWrite(13, LOW); } } } } }
E aqui está a programação do MP3 SHIELD
// PLAYER MP3 LAB DE GARAGEM
// Baseado no exemplo MP3Shield_Library_Demo de Bill Porter e Michael P. Flaga criadores da biblioteca SFEMP3Shield
// Coloque as músicas no SD card para com o nome track00x.mp3 onde x é o numero da música
#include <SPI.h>
#include <SdFat.h>
#include <SFEMP3Shield.h>
SdFat sd;
SFEMP3Shield MP3player;
void setup()
{
//Variável usada para testar funções durante a programação
uint8_t resultado;
// Inicializa a Serial
Serial.begin(115200);
//Inicializando Cartao SD
if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();
if(!sd.chdir("/")) sd.errorHalt("sd.chdir");
//Inicializando MP3 Shield e checa por erros
resultado = MP3player.begin();
//Lista de código de Erros de inicialização
//0 OK
//1 Falha da SdFat para inicializar o contato físico com o Cartão SD
//2 Falha SdFat para iniciar o volume do Cartão SD
//3 Falha SdFat para montar o diretório raiz Cartão SD
//4 Valores fora do padrão no registrador SCI_MODE.
//5 Valores divergentes no na leitura do SCI_CLOCKF.
//6 Plugins não foram carregado. Copie eles para o Cartão SD isto pode causar erros na reprodução
if(resultado != 0)
{
Serial.print(F("Codigo de erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
if( resultado == 6 )
{
Serial.println(F("Atencao: Plugins não encontrados."));
Serial.println(F("Use a opção \"d\" para verificar se eles estão no cartao SD"));
}
}
comandos();
}
void loop()
{
if(Serial.available())
{
menu(Serial.read()); // Pega o comando da Serial e processa com a função menu();
}
delay(100);
}
// Função que processa o comando.
void menu(byte opcao)
{
uint8_t resultado; // Esta variavel vai armazenar o resultado dos funções que vamos usar
char titulo[30]; // Buffer para armazenas título da musica
char artista[30]; // Buffer para armazenas nome do Artista
char album[30]; // Buffer para armazenas nome do Album
Serial.print(F("Comando Recebido: "));
Serial.write(opcao);
Serial.println();
//Parar a música que esta tocando
if(opcao == 's')
{
Serial.println(F("Parar reproducao"));
MP3player.stopTrack();
}
//Seleciona a faixa de 1 a 9
else if(opcao >= '1' && opcao <= '9')
{
opcao = opcao - 48; //convertendo ASCII para um numero real
resultado = MP3player.playTrack(opcao);
//Lista de código de Erros da função playTrack
//0 OK
//1 Ocupado tocando música
//2 Arquivo não encontrado
//3 Indica que o Shield MP3 esta resetando
//Verifica esta executando
if(resultado != 0)
{
Serial.print(F("Codigo de Erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
}
else
{
//Retira a Tag ID3 da música
MP3player.trackTitle((char*)&titulo);
MP3player.trackArtist((char*)&artista);
MP3player.trackAlbum((char*)&album);
//Imprime as informações na Serial
Serial.print(F("Titulo: "));
Serial.write((byte*)&titulo, 30);
Serial.println();
Serial.print(F("Artista: "));
Serial.write((byte*)&artista, 30);
Serial.println();
Serial.print(F("Album: "));
Serial.write((byte*)&album, 30);
Serial.println();
}
}
//Altera o Volume
else if((opcao == '-') || (opcao == '+'))
{
union twobyte mp3_vol; // Cria dois bytes um para cada lado
mp3_vol.word = MP3player.getVolume(); // Lê o valor atual do Volume
if(opcao == '-')
{
// O saida é negativa pois é dada em decibéis
if(mp3_vol.byte[1] >= 254)
{
mp3_vol.byte[1] = 254;
}
else {
mp3_vol.byte[1] += 2;
}
}
else
{
if(mp3_vol.byte[1] <= 2)
{
mp3_vol.byte[1] = 2;
}
else {
mp3_vol.byte[1] -= 2;
}
}
MP3player.setVolume(mp3_vol.byte[1], mp3_vol.byte[1]); // Altera o valor do volume nos dois lados (L e R)
Serial.print(F("Volume foi para -"));
Serial.print(mp3_vol.byte[1]>>1, 1);
Serial.println(F("[dB]"));
}
//Lista arquivos do SD card
else if(opcao == 'd') {
if(!MP3player.isPlaying())
{
Serial.println(F("Arquivos encontrados:"));
sd.ls(LS_R | LS_DATE | LS_SIZE);
}
else {
Serial.println(F("Player ocupado. Aguarde..."));
}
}
//Informacoes sobre o arquivo de audio
else if(opcao == 'i') {
MP3player.getAudioInfo();
}
//Modo Pause/Play
else if(opcao == 'p')
{
if( MP3player.getState() == playback)
{
MP3player.pauseMusic();
Serial.println(F("Pause"));
}
else if( MP3player.getState() == paused_playback)
{
MP3player.resumeMusic();
Serial.println(F("Play"));
}
else
{
Serial.println(F("Nao esta tocando!"));
}
}
// Reseta o módulo MP3
else if(opcao == 'r') {
MP3player.stopTrack();
MP3player.vs_init();
Serial.println(F("Resetando o chip do Player"));
}
// Seleciona modo Mono/Stereo
else if(opcao == 'm') {
uint16_t monostate = MP3player.getMonoMode();
if(monostate == 0) {
MP3player.setMonoMode(1);
Serial.println(F("Modo Mono"));
}
else {
MP3player.setMonoMode(0);
Serial.println(F("Modo Stereo"));
}
}
//Modo baixo consumo
else if(opcao == 'a') {
MP3player.end();
Serial.println(F("Modo de baixo consumo: Ativado"));
}
else if(opcao == 'd') {
MP3player.begin();
Serial.println(F("Modo de baixo consumo: Desativado"));
//Estado do Shield MP3
}
else if(opcao == 'S') {
Serial.println(F("Estado do Player:"));
switch (MP3player.getState()) {
case uninitialized:
Serial.print(F("Nao inicializado"));
break;
case initialized:
Serial.print(F("Inicializado"));
break;
case deactivated:
Serial.print(F("Desativado"));
break;
case loading:
Serial.print(F("Carregando"));
break;
case ready:
Serial.print(F("Pronto"));
break;
case playback:
Serial.print(F("Reproduzindo"));
break;
case paused_playback:
Serial.print(F("Pausado"));
break;
}
Serial.println();
}
// Lista comandos
else if(opcao == 'c')
{
comandos();
}
// print prompt after key stroke has been processed.
Serial.println(F("Digite uma das opcoes 1-9,s,d,+,-,i,p,r,m,a,d,S,c:"));
Serial.println();
}
//Imprime a lista de comandos
void comandos()
{
Serial.println(F("MP3 Player Shield:"));
Serial.println();
Serial.println(F("LAB DE GARAGEM "));
Serial.println();
Serial.println(F("Lista de comandos:"));
Serial.println(F(" [1-9] para tocar o arquivo track00x"));
Serial.println(F(" [s] Stop"));
Serial.println(F(" [d] Lista arquivos do SD card"));
Serial.println(F(" [+ ou -] Aumenta e diminui o Volume"));
Serial.println(F(" [i] Informacoes sobre o arquivo de audio"));
Serial.println(F(" [p] Pause/Play"));
Serial.println(F(" [r] Reseta MP3 Shield"));
Serial.println(F(" [m] Seleciona modo Mono/Stereo"));
Serial.println(F(" [a} Ativa modo de baixo consumo"));
Serial.println(F(" [d} Desativa modo de baixo consumo"));
Serial.println(F(" [S] Estado do Shield MP3"));
Serial.println(F(" [c] Mostra lista de comandos"));
Serial.println();
}
Agradeço a atenção de vocês e novamente peço que se vocês puderem me ajudar, estou disposto a ajudar financeiramente (nada muito volumoso, mas dá para tomar algumas cervejinhas)!
Um abraço…
ncionou bem (programa abaixo), depois copiei um programa para realizar as leituras do sensor DS18B20 e consegui obter as leituras, ótimo até ai tudo bem, então pensei em achar um programa de menu para usar o KeyPad Shield, consegui achar um bem bacana e o traduzi pro português, (conforme abaixo), e o mesmo esta funcionando bem, navego nas opções e quando pressiono o botão select ele chama a opção selecionada, até ai tudo bem, o que eu gostaria era saber como eu faço para por neste menu as opções para fazer aparecer no LCD os dados de de data e hora quando por exemplo selecionar a opção 1 do menu, e depois aparecer a temperatura do DS18B20 quando seleciono a opção 2. Talvez esta seja uma solução muito básica, porém pra mim que sou muito leigo no assunto parece um dragão de sete cabeças kkkk. Agradeço antecipadamente pela atenção e ajuda.
//----------------------------------------------------------------------------------------------------------------------------------------------
//PROGRAMA PARA APARECER OS DADOS DO RTC NO DISPLAY
//obs ja tem alguns codigos do DS18B20
#include <Wire.h>#include "ds3231.h"#include "rtc_ds3231.h"#include <LiquidCrystal.h>#include <OneWire.h>#include <DallasTemperature.h>
#define BUFF_MAX 128#define ONE_WIRE_BUS 2 //variavel do pino que esta plugado o Sensor
OneWire oneWire(ONE_WIRE_BUS); //Instacia o Objeto oneWire e Seta o pino do Sensor para iniciar as leiturasDallasTemperature sensor(&oneWire);//Repassa as referencias do oneWire para o Sensor Dallas (DS18B20)uint8_t time[8];char recv[BUFF_MAX];unsigned int recv_size = 0;unsigned long prev, interval = 1000;char minuto = 0;char hora = 0;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { //-------------------------------------------------------------------------------------//INICIO BLOCO TESTE BOTOES DISPLAY //lcd.begin(16, 2); //lcd.setCursor(0,0); //lcd.print("Arduino e Cia"); //lcd.setCursor(0,1); //lcd.print("Tecla :"); //FIM BLOCO TESTE BOTOES DISLPLAY//-------------------------------------------------------------------------------------
pinMode(7, OUTPUT); //PINO DO RELE Serial.begin(9600); Serial.println("Sensor de temperatura Dallas DS18b20"); sensor.begin(); Wire.begin(); DS3231_init(DS3231_INTCN); memset(recv, 0, BUFF_MAX); //Serial.println("GET time"); lcd.begin(16, 2); lcd.clear(); // *************************************** // * PARA AJUSTAR RELOGIO *// * Serial.println("Setting time"); *// * parse_cmd("T301218513112015",16); *// *************************************** } void loop() { //SENSOR DE TEMPERATURA LIQUIDOS DS18B20 sensor.requestTemperatures(); //Envia o comando para obter temperaturas float leitura=sensor.getTempCByIndex(0); // A temperatura em Celsius para o dispositivo 1 no índice 0 (é possivel ligar varios sensores usando a mesma porta do arduino) Serial.println(leitura); // INICIO FUNÇÃO DO RELOGIO char in; char tempF[6]; float temperature; char buff[BUFF_MAX]; unsigned long now = millis(); struct ts t; // show time once in a while if ((now - prev > interval) && (Serial.available() <= 0)) { DS3231_get(&t); //Get time parse_cmd("C",1); temperature = DS3231_get_treg(); //Get temperature dtostrf(temperature, 5, 1, tempF);
lcd.clear(); lcd.setCursor(0,0); lcd.print(t.mday); printMonth(t.mon); lcd.print(t.year); lcd.setCursor(0,1); //Go to second line of the LCD Screen lcd.print(t.hour); lcd.print(":"); if(t.min<10) { lcd.print("0"); } lcd.print(t.min); lcd.print(":"); if(t.sec<10) { lcd.print("0"); } lcd.print(t.sec); lcd.print(' '); lcd.print(tempF); lcd.print((char)223); lcd.print("C "); prev = now; }
if (Serial.available() > 0) { in = Serial.read();
if ((in == 10 || in == 13) && (recv_size > 0)) { parse_cmd(recv, recv_size); recv_size = 0; recv[0] = 0; } else if (in < 48 || in > 122) {; // ignore ~[0-9A-Za-z] } else if (recv_size > BUFF_MAX - 2) { // drop lines that are too long // drop recv_size = 0; recv[0] = 0; } else if (recv_size < BUFF_MAX - 2) { recv[recv_size] = in; recv[recv_size + 1] = 0; recv_size += 1; }
} // SELEÇÃO DA CADA BOTÃO DO DISLPLAY int botao; botao = analogRead (0); //Leitura do valor da porta analógica A0 //Serial.println(botao); lcd.setCursor(8,1); if (botao < 100) { lcd.print ("Direita "); } else if (botao < 200) { lcd.print ("Cima "); } else if (botao < 400){ lcd.print ("Baixo "); } else if (botao < 600){ lcd.print ("Esquerda"); } else if (botao < 800){ lcd.print ("Select "); } }//FINAL DE SELEÇÃO DE BOTOES//------------------------------------------------------------------------------
void parse_cmd(char *cmd, int cmdsize){ uint8_t i; uint8_t reg_val; char buff[BUFF_MAX]; struct ts t;
if (cmd[0] == 84 && cmdsize == 16) { t.sec = inp2toi(cmd, 1); t.min = inp2toi(cmd, 3); t.hour = inp2toi(cmd, 5); t.wday = inp2toi(cmd, 7); t.mday = inp2toi(cmd, 8); t.mon = inp2toi(cmd, 10); t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14); DS3231_set(t); Serial.println("OK"); } else if (cmd[0] == 49 && cmdsize == 1) { // "1" get alarm 1 DS3231_get_a1(&buff[0], 59); Serial.println(buff); } else if (cmd[0] == 50 && cmdsize == 1) { // "2" get alarm 1 DS3231_get_a2(&buff[0], 59); Serial.println(buff); } else if (cmd[0] == 51 && cmdsize == 1) { // "3" get aging register Serial.print("aging reg is "); Serial.println(DS3231_get_aging(), DEC); } else if (cmd[0] == 65 && cmdsize == 9) { // "A" set alarm 1 DS3231_set_creg(DS3231_INTCN | DS3231_A1IE); //ASSMMHHDD for (i = 0; i < 4; i++) { time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd } boolean flags[5] = { 0, 0, 0, 0, 0 }; DS3231_set_a1(time[0], time[1], time[2], time[3], flags); DS3231_get_a1(&buff[0], 59); Serial.println(buff); } else if (cmd[0] == 66 && cmdsize == 7) { // "B" Set Alarm 2 DS3231_set_creg(DS3231_INTCN | DS3231_A2IE); //BMMHHDD for (i = 0; i < 4; i++) { time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd } boolean flags[5] = { 0, 0, 0, 0 }; DS3231_set_a2(time[0], time[1], time[2], flags); DS3231_get_a2(&buff[0], 59); Serial.println(buff); } else if (cmd[0] == 67 && cmdsize == 1) { // "C" - get temperature register // Serial.print("temperature reg is "); //Serial.println(DS3231_get_treg(), DEC); } else if (cmd[0] == 68 && cmdsize == 1) { // "D" - reset status register alarm flags reg_val = DS3231_get_sreg(); reg_val &= B11111100; DS3231_set_sreg(reg_val); } else if (cmd[0] == 70 && cmdsize == 1) { // "F" - custom fct reg_val = DS3231_get_addr(0x5); Serial.print("orig "); Serial.print(reg_val,DEC); Serial.print("month is "); Serial.println(bcdtodec(reg_val & 0x1F),DEC); } else if (cmd[0] == 71 && cmdsize == 1) { // "G" - set aging status register DS3231_set_aging(0); } else if (cmd[0] == 83 && cmdsize == 1) { // "S" - get status register Serial.print("status reg is "); Serial.println(DS3231_get_sreg(), DEC); } else { Serial.print("unknown command prefix "); Serial.println(cmd[0]); Serial.println(cmd[0], DEC); } }
void printMonth(int month){
switch(month) { case 1: lcd.print(" Janeiro ");break; case 2: lcd.print(" Fevereiro ");break; case 3: lcd.print(" Março ");break; case 4: lcd.print(" Abril ");break; case 5: lcd.print(" Maio ");break; case 6: lcd.print(" Junho ");break; case 7: lcd.print(" Julho ");break; case 8: lcd.print(" Agosto ");break; case 9: lcd.print(" Setembro ");break; case 10: lcd.print(" Outubro ");break; case 11: lcd.print(" Novembro ");break; case 12: lcd.print(" Dezembro ");break; default: lcd.print(" Error ");break; } } //FINAL FUNÇÃO RELOGIO//---------------------------------------------------------------------------
//PROGRAMA DE MENUS PARA LCD KEYPAD SHIELD
#include <LiquidCrystal.h>// Pinos para LCD Shield Keypad - Não serve para lcd comumLiquidCrystal lcd(8, 9, 4, 5, 6, 7);//Estados do menusint atualMenuItem = 0;int lastState = 0;void setup() {//Iniciando o LCD 16x2 do Display Keypad.lcd.begin(16, 2);//Mostar o Titulo do Menu.clearPrintTitle();}void loop() {//Chma o menu principalmainMenu();}void mainMenu() {//Estado = 0 cada ciclo de loop.int state = 0;//Atualiza o botão pressionado.int x = analogRead (0);//Define a linha e a coluna.lcd.setCursor(0,0);//Verifica os valores analogicos da porta A0 do LCD Keypad Shieldif (x < 100) {//Direita} else if (x < 200) {//Cimastate = 1;} else if (x < 400){//Baixostate = 2;} else if (x < 600){//Esquerda} else if (x < 800){//Selecionarstate = 3;}//Se os limites do MENU for ultrapassados o reiniciamosif (atualMenuItem < 0 || atualMenuItem > 4) {atualMenuItem = 0; }//Se mudarmos o index o redesenhamos.if (state != lastState) {if (state == 1) {//Se pra cimaatualMenuItem = atualMenuItem - 1; displayMenu(atualMenuItem);} else if (state == 2) {//Se pra baixoatualMenuItem = atualMenuItem + 1; displayMenu(atualMenuItem);} else if (state == 3) {//Se selecionadoselectMenu(atualMenuItem); }//Salva o estado anterior para compara-lo.lastState = state;} //Pequeno delaydelay(5);}//Opções do menu.void displayMenu(int x) {switch (x) {case 1:clearPrintTitle();lcd.print ("-> Menu Opcao 1");break;case 2:clearPrintTitle();lcd.print ("-> Menu Opcao 2");break;case 3:clearPrintTitle();lcd.print ("-> Menu Opcao 3");break;case 4:clearPrintTitle();lcd.print ("-> Menu Opcao 4");break;}}//Bloco para o cabeçalho do MENU.void clearPrintTitle() {lcd.clear();lcd.setCursor(0,0);lcd.print(" MEU-MENU ");lcd.setCursor(0,1); }//Bloco que mostra a seleção na telavoid selectMenu(int x) {switch (x) {case 1:clearPrintTitle();lcd.print ("Op 1 Selecionada");//Chama a função da Opção 1break;case 2:clearPrintTitle();lcd.print ("Op 2 Selecionada");//Chama a função da Opção 2break;case 3:clearPrintTitle();lcd.print ("Op 3 Selecionada");//Chama a função da Opção 3break;case 4:clearPrintTitle();lcd.print ("Op 4 Selecionada");//CChama a função da Opção 4break;}}…
mosa “luzinha azul”
No mundo do IoT e da automação em geral, é muito comum deparar-nos com controles remotos via celulares utilizando tecnologia BT. Isso é devido a 3 componentes básicos mas muito importantes:
Plataforma de desenvolvimento para Android
Módulos BT baratos e acessíveis (Como por exemplo o HC-06)
E claro, o velho e bom Arduino....
Neste tutorial, vou desenvolver algumas idéias de como controlar as saídas de um Arduíno através de um celular de maneira a mover um Robot, acionar lâmpadas em uma casa, etc.
No mercado é comum encontrar módulos de BT 3.0 “Master-Slave” como o HC-05 e “Slaves” como o HC-06. Já mais recentemente, apareceram os HC-08 e HC-10 que trabalham com tecnologia BT 4.0 ou BLE (“Bluetooth Low Energy”). Os módulos BLE são os únicos que podem ser conectados a um Iphone, pois infelizmente a Apple não fornece suporte a ao BT 3.0.
Para os projetos discutidos aqui, usarei um HC-06 que é bem popular e barato (Bye, bye, Iphone, vamos de Android!). O Módulo é alimentado com 5V o que faz com que ele seja facilmente conectado a um Arduino UNO por exemplo, para receber e transmitir informações a outros dispositivos como um PC ou um telefone celular. Seus pinos de transmissão e recepção podem ser conectados diretamente ao UNO, não havendo a necessidade de se utilizar divisores de tensão como vimos no caso do ESP8266.
Na prática, o HC-06 deve ser ligado diretamente aos pinos 0 e 1 do Arduino (Serial):
HC06-Tx ao Arduino pin 0 (Rx)
HC06-Rx ao Arduino pin 1 (Tx)
Ao se usar a entrada serial por HW do UNO é muito importante lembrar-se que o HC-06 não pode estar fisicamente conectado aos pinos 0 e 1 durante a carga do programa, isso porque o USB também usa essa mesma serial. Uma maneira simples de se contornar esse probleminha (se seu projeto não utiliza muitos GPIOs do UNO) é usar uma porta serial por SW através da library SoftwareSerial (a mesma que usamos no caso do ESP8266). Em nosso caso aqui, usaremos os pinos 10 e 11 do UNO (Tx, Rx respectivamente).
O passo seguinte será escrever um codigo bem simples para se poder testar, programar e inicializar o HC-o6:
Para iniciar, incluir a Library Software Serial, definindo a variável “BT” como a nova porta serial.
#include <SoftwareSerial.h> SoftwareSerial BT(10, 11); // RX, TX String command = ""; // Stores response of bluetooth device
void setup() { Serial.begin(9600); Serial.println("Type AT commands!"); BT.begin(9600); // HC-06 usually default baud-rate }
Em seguida vem o corpo principal do código que simplesmente espera por dados vindos do BT e uma vez que eles chegem, os mesmos são escritos no Serial Monitor. Da mesma maneira, se podem enviar comandos AT desde o monitor serial até o módulo HC-06.
void loop() { if (BT.available()) // Read device output if available. { while(BT.available()) // While there is more to be read, keep reading. { delay(10); //Delay added to make thing stable char c = BT.read(); //Conduct a serial read command += c; //build the string. } Serial.println(command); command = ""; // No repeats } if (Serial.available()) { delay(10); // The DELAY! ********** VERY IMPORTANT ******* BT.write(Serial.read()); } }
Uma vez carregado o programa, faça alguns testes básicos. Por exemplo:,
Envie “AT“, o módulo deverá responder “OK“.
Pergunte a versão do Firmware: “AT+VERSION”, o módulo deverá responser, por exemplo: “linvorV1.8“.
Com o HC-06 é possível definir um nome para o módulo por exemplo: “AT+NAMEMJRoBot_BT_HC06“. Mas diferente de outros módulos, voce não conseguirá saber qual é o nome que está definido para o módulo. Ao se enviar o comando anterior, o HC-06 responderá simplesmente: “OKsetname”.
Em geral, o HC-o6 vem de fábrica com o password (ou PIN): 1234. Voce poderá definir um novo com o comando AT: AT+PINxxxx onde ‘xxxx‘ serão 4 números.
OK! Módulo conectado ao UNO e funcionando. Hora de lançar mão do velho e bom celular Android!!!
Existem muitas apps na loja da Google que podem ser utilizadas. Vou sugerir duas delas, por serem as que usarei em meus tutoriais. Essas apps foram desenvolvidas por mim utilizando o MIT Application2 tool (ver projeto aqui) e estão disponíveis sem custo na loja da Google:
MJRoBoT II BT Control
MJRoBot BT Digital Analog Voice Control
O App MJR0Bot II foi desenvolvido para comandar Robots. Ele basicamente envia um caracter para cada comando de direção, modos AUTO/MANUAL, velocidade + e velocidade-. Alem de permitir o envio de mensagens em modo texto.
O App. MJRoBot Digital Analog Voice Control, envia comandos para acionamento digitais (ligar/desligar) tanto por botões como por voz e comandos numéricos para controle de PWMs (0-255).
Faça o Download de qualquer uma das duas Apps, vá ao set-up do celular e procure o modulo BT fazendo a conexão (entre com o PIN 1234 ou algum outro definido por você). Isso deverá ser feito uma única vez, pois o celular guardará os dados de conexão. Uma vez que o celular e o HC-06 estão conversando, é só usar as APPs.
A partir da segunda vez, ao lançar-se a app, o modulo BT estará desconectado.
Acione o botão de BT, para que o app informe dos modulos disponíveis:
Selecione o nome do módulo (No caso é esse com o HC-06 ao final).
O App então mostrará “CONNECTED”, informando que está “pared” com o HC-06
A partir daí, é só ir acionando os botões do APP e observar no Monitor Serial, o que é que o APP está enviando.
Por exemplo, acionando “ON” e “OFF” sequencialmente para os 4 devices, no caso da APP MJRoBot Digital Analog Voice Control, o resultado seria:
dev1on dev1off dev2on dev2off dev3on dev3off dev4on dev4off
Agora que já temos um App para o Android e sabemos como funciona um modulo BT, vamos colocar a mão na massa e criar algo de util!
Controlando as saídas do Arduino.
Vamos construir o circuito abaixo:
A idéia será usar o App MJRoBot Digi/Ana/Voice Ctrl para acender e apagar os LEDS e também controlar a intensidade dos mesmos usando PWM.
Estaremos relacionando:
Device 1: "dev1on/dev1off" ==> LED Red ==> Pin 3 do UNO
Device 2: "dev2on/dev2off" ==> LED Yellow ==> Pin 5 do UNO
Device 3: "dev3on/dev3off" ==> LED Green==> Pin 6 do UNO
Device 4: "dev4on/dev4off" ==> LED Blue==> Pin 9 do UNO
Ou seja, ao acionar o botão “ON” relacionado ao “Device 1”, a mensagem de texto “dev1on”será enviada ao Arduino. Ao receber essa mensagem, o LED vermelho deverá acender e assim por diante.
Observe que os 4 pinos são pinos com capacidade de gerar PWM. Isso é importante para a utilização dos “sliders” da App, que enviarão valores para controlar a intensidade dos LEDs via PWM:
Dev A0: "r/ 0-255" ==> LED Red ==> Pin 3 do UNO
Dev A1: "y/ 0-255" ==> LED Yellow ==> Pin 5 do UNO
Dev A2: "g/ 0-255" ==> LED Green==> Pin 6 do UNO
Dev A3: "b/ 0-255" ==> LED Blue==> Pin 9do UNO
No caso dos controles deslizantes (“sliders”), antes dos valores para controle do PWM (0 a 255), um caracter será enviado para que o Arduino saiba de que “slider” estará chegando o comando.
O Código:
Setup inicial:
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); //TX, RX respectively String device;
const int dev1 = 3; //PWM const int dev2 = 5; //PWM const int dev3 = 6; //PWM const int dev4 = 9; //PWM
void setup() { BT.begin(9600); Serial.begin(9600);
pinMode(dev1, OUTPUT); pinMode(dev2, OUTPUT); pinMode(dev3, OUTPUT); pinMode(dev4, OUTPUT); }
Podemos dividir a parte principal do programa em 4 blocos:
Espera dos comandos BT e construção da variável “device”
Acionamento dos LEDS a partir dos botões
Acionamento dos LEDS a partir de comandos de voz
Controle do intensidade dos LEDs via Sliders
void loop() { while (BT.available()) //Check if there is an available byte to read { delay(10); //Delay added to make thing stable char c = BT.read(); //Conduct a serial read device += c; //build the string. } if (device.length() > 0) { Serial.println(device); // Button control: if (device == "dev1on") {digitalWrite(dev1, HIGH);} else if (device == "dev1off") {digitalWrite(dev1, LOW);} else if (device == "dev2on") {digitalWrite(dev2, HIGH);} else if (device == "dev2off") {digitalWrite(dev2, LOW);} else if (device == "dev3on") {digitalWrite(dev3, HIGH);} else if (device == "dev3off") {digitalWrite(dev3, LOW);} else if (device == "dev4on") {digitalWrite(dev4, HIGH);} else if (device == "dev4off") {digitalWrite(dev4, LOW);}
// Voice control: else if (device == "ligar um" || device == "Ligar 1") {digitalWrite(dev1, HIGH);} else if (device == "desligar um" || device == "desligar 1") {digitalWrite(dev1, LOW);} else if (device == "ligar som" || device == "Ligar som") {digitalWrite(dev2, HIGH);} else if (device == "desligar som" || device == "Desligar som") {digitalWrite(dev2, LOW);} else if (device == "ligar TV" || device == "Ligar TV") {digitalWrite(dev3, HIGH);} else if (device == "desligar TV" || device == "Desligar TV") {digitalWrite(dev3, LOW);} else if (device == "ligar quarto" || device == "Ligar quarto") {digitalWrite(dev4, HIGH);} else if (device == "desligar quarto" || device == "Desligar quarto") {digitalWrite(dev4, LOW);}
// Slider control: char colour = device[0]; int value = device[2]; Serial.print(" "); Serial.println(value); if ( colour == 'r') { analogWrite(dev1, value); // use value to set PWM for LED brightness } if ( colour == 'y') { analogWrite(dev2, value); // use value to set PWM for LED brightness } if ( colour == 'g') { analogWrite(dev3, value); // use value to set PWM for LED brightness } if ( colour == 'b') { analogWrite(dev4, value); } device=""; //Reset the variable } }
Deixo aqui o link para os códigos usados neste tutorial:
Link para os códigos Arduino
No vídeo abaixo, uma demonstração da porção programa acima (botões & Slider):
Vídeo demo comando por botões e Slider
O controle de dispositivos IoT por voz é uma tendência nos dias de hoje. Conseguir este tipo de controle com o conjunto Arduino/HC-06/Android é extremamente simples. Os dispositivos Android já possuem essa característica “de fábrica”. No App que desenvolvi, apenas acrescentei um botão que faz com que o Android “escute” um comando e o envie em formato texto para o Arduino. O codigo se encarrega de “ler” a string que chega.
Em vermelho, ressalto no código alguns possíveis comandos de voz. Ao receber por “Ligar TV” por exemplo, o LED verde (correspondente ao device 3) acenderá (em vez do LED podíamos ter uma relé que ligaria a TV).
No vídeo abaixo, uma pequena demonstração do controle por voz:
Vídeo demo de comandos por voz.
Bom, acredito que já é possível ver o enorme potencial do controle de “coisas” usando BT/Android/Arduino. Em meus próximos posts estarei desenvolvendo Robots que poderão ser controlados remotamente como vimos aqui.
Para mais tutoriais, demos, vídeos, etc. visite meu blog:
MJRoBot.org
Um abraço e até mais!
…
Adicionado por Marcelo Rovai ao 19:45 em 31 janeiro 2016
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…