tos que podem ser configurados, alguns dos quais mostrarei aqui mais à frente. O código para download está no final do post.
Mas antes, gostaria de falar sobre seu Hardware. Pelo vídeo que vc postou, parece que vc está usando um Arduino UNO, e um módulo de controle de Motor da Adafruit versão "V1" (ou um clone deste).
Ainda sobre seu Hardware, também parece que vc está usando uma plaquinha com Sensor Óptico semelhante à mostrada em "frente e verso" na figura a seguir:
(clique na figura para "zoom")
Caso vc esteja usando um módulo Sensor como o mostrado na figura anterior, poderia confirmar qual sinal da plaquinha ("DO" ou "AO") vc está conectando ao pino "2" do Arduino ?
Pergunto isso porque o sinal "DO" tem transição digital um pouco melhor que o sinal "AO". Então o ideal seria usar o "DO" da plaquinha do Sensor. Mas isto não é imprescindível, uma vez que as entradas digitais do Arduino (UNO, Nano, etc) tem característica "Schmitt Trigger". Mesmo assim é sempre aconselhável tentar seguir as melhores práticas.
Para testar o código, preparei uma Simulação no Proteus usando o Arduino UNO. Nesta simulação, há diversos geradores de sinal, onde cada um gera uma frequência que seja 20x cada giro do eixo do Motor, justamente como no seu Sistema. Então estes sinais são equivalentes às saídas de diversos Sensores Ópticos, o que permite verificar a qualidade da medição em várias faixas de RPM, indo de zero até 15 mil RPMs. O circuito usado na simulação pode ser visto na figura a seguir:
(clique na figura para "zoom")
Observe que para obter zero RPM, usa-se a chave "SW2", a qual pode impedir que o sinal selecionado em "SW1" chegue ao pino "2" do Arduino.
Obviamente que, no momento exato de uma mudança de posição das chaves, pode ocorrer um erro na medição da RPM, já que qualquer mudança nas chaves é assíncrona ao mecanismo de medição. Mas isso, se ocorrer, é apenas naquele momento da mudança.
No final do post, há um link para um vídeo mostrando a simulação. Mas um print capturado da tela de simulação pode ser visto na figura a seguir:
(clique na figura para "zoom")
A figura anterior mostra a RPM no Terminal do Arduino, conforme fui mudando a posição da chave "SW1", indo de 100 RPM até 15000 RPM.
Agora falando sobre o código, ele está totalmente organizado e com comentários funcionais que explicam todos os processos. Então irei exibir apenas alguns pontos a respeito das configurações do funcionamento.
A figura a seguir mostra a configuração do número de Pulsos por giro do Motor, que no caso é de 20 Pulsos por giro:
(clique na figura para "zoom")
Vc pode também especificar um "timeout", para o caso do Sensor parar de gerar os Pulsos (seja por qual motivo for). Após este "timeout", o valor da RPM é zerada. Assim este "timeout" irá determinar a mínima RPM que o Sistema é capaz de medir. A figura a seguir mostra a definição deste "timeout":
(clique na figura para "zoom")
A "printagem" da RPM no Terminal do Arduino, é feita em intervalos regulares, e isto pode ser especificado em segundos, conforme mostrado na figura a seguir:
(clique na figura para "zoom")
Tanto em relação ao "timeout" da medição, quanto ao intervalo de "printagem", atente para as observações que estão nos comentários no código.
O valor "printado", é da variável de nome "RPM_atual", a qual vc pode acessar em qualquer ponto do seu código (mas apenas lendo o valor da mesma !!!). Esta variável pode ser vista na figura a seguir:
(clique na figura para "zoom")
Observar que a variável "RPM_atual" é do tipo "float", e portanto também indica valores fracionários de RPM. Caso vc precise apenas de valores inteiros, basta copiá-la para uma variável deste tipo (por exemplo "int"), com o que a parte fracionária será descartada. Mas também pode "copiá-la" arredondando o valor (pode fazer isto discretamente via código ou usar uma função matemática de arredondamento daquelas de algumas LIBs "padrões" da Linguagem C).
O cálculo da RPM é através de parâmetros medidos no Sistema, conforme pode-se ver na função que faz este cálculo, mostrada na figura a seguir:
(clique na figura para "zoom")
A medição destes parâmetros é conduzida por uma Máquina de Estados bastante simples, composta de apenas 3 estados (onde efetivamente apenas 2 estados fazem a medição, pois um deles é apenas usado uma única vez na inicialização do mecanismo de medição). A definição dos estados e a própria Máquina de Estados pode ser visto na figura a seguir:
(clique na figura para "zoom")
Na figura anterior, as áreas marcadas nas cores amarela, verde, e laranja, facilitam identificar os 3 estados implementados na Máquina. Note a simplicidade do código.
No "setup" do Arduino são inicializados os elementos e recursos necessários, enquanto que no "loop" do Arduino é executada a Máquina de Estados e o gerenciamento da "printagem" da RPM, conforme pode ser visto na figura a seguir:
(clique na figura para "zoom")
O download do código e da simulação está aqui: "entrada_degrau_02.zip"
E o vídeo da simulação pode ser visto ou feito download aqui: "video simulação"
Caso tenha alguma dúvida, não deixe de perguntar.
Espero ter ajudado.
abrçs,
Elcids…
Adicionado por Elcids Chagas ao 9:36 em 29 julho 2021
R3 é uma placa de desenvolvimento microcontrolada baseada no ATmega328P (datasheet).Ela possui 14 pinos de entrada/saída digital (dos quais 6 podem ser usados como saídas analógicas PWM), 6 entradas analógicas, um cristal oscilador de 16 MHz, uma conexão USB, uma entrada para alimentação, um cabeçalho ICSP e um botão de reset. Ele contém tudo que é necessário para que o microcontrolador funcione.
Para começar, apenas faça a conexão com um computador através de um cabo USB ou use uma fonte de alimentação de corrente contínua ou uma bateria.
Características:
Microcontrolador
ATmega328P
Voltagem operacional
5V
Voltagem de alimentação (recomendada)
7-12V
Voltagem de alimentação (limites)
6-20V
Pinos I/O digitais
14 (dos quais 6 podem ser saídas PWM)
Pinos de entrada analógica
6
Corrente contínua por pino I/O
40 mA
Corrente contínua para o pino 3.3V
50 mA
Memória flash
32 KB (2KB usados para o bootloader)
SRAM
2 KB
EEPROM
1 KB
Velocidade de clock
16 MHz
Alimentação:
O Arduino UNO pode ser alimentado pela conexão USB ou por qualquer fonte de alimentação externa. A fonte de alimentação é selecionada automaticamente.
Alimentação externa (não-USB) pode ser tanto de uma fonte ou de uma bateria. A fonte pode ser conectada com um plug de 2,1mm (centro positivo) no conector de alimentação. Cabos vindos de uma bateria podem ser inseridos nos pinos Gnd (terra) e Vin (entrada de voltagem) do conector de alimentação.
A placa pode operar com uma alimentação externa de 6 a 20 volts. Entretanto, se a alimentação for inferior a 7 volts o pino 5V pode fornecer menos de 5 volts e a placa pode ficar instável. Se a alimentação for superior a 12 volts o regulador de voltagem pode super-aquecer e avariar a placa. A alimentação recomendada é de 7 a 12 volts.
Os pinos de alimentação são:
VIN. Entrada de alimentação para a placa Arduino quando uma fonte externa for utilizada. Você pode fornecer alimentação por este pino ou, se usar o conector de alimentação, acessar a alimentação por este pino.
5V. A fonte de alimentação utilizada para o microcontrolador e para outros componentes da placa. Pode ser proveniente do pino Vin através de um regulador on-board ou ser fornecida pelo USB ou outra fonte de 5 volts.
3V3. Alimentação de 3,3 volts fornecida pelo chip FTDI. A corrente máxima é de 50 mA.
GND. Pino terra.
Memória:
O ATmega328P tem 32 KB de memória flash para armazenar código (dos quais 2 KB são utilizados pelo bootloader), além de 2 KB de SRAM e 1 KB of EEPROM (que pode ser lida e escrita através da biblioteca EEPROM ).
Entrada e Saída:
Cada um dos 14 pinos digitais do Arduino UNO pode ser usado como entrada ou saída usando as funções de pinMode(), digitalWrite(), e digitalRead(). Eles operam com 5 volts. Cada pino pode fornecer ou receber um máximo de 40 mA e tem um resistor pull-up interno (desconectado por padrão) de 20-50 kOhms. Além disso, alguns pinos têm funções especializadas:
Serial: 0 (RX) e 1 (TX). Usados para receber (RX) e transmitir (TX) dados seriais TTL. Estes pinos são conectados aos pinos correspondentes do chip serial FTDI USB-to-TTL.
External Interrupts: 2 and 3. Estes pinos podem ser configurados para disparar uma interrupção por um baixo valor, uma elevação ou falling edge ou uma mudança de valor. Veja a função attachInterrupt() para mais detalhes.
PWM: 3, 5, 6, 9, 10, e 11. Fornecem uma saída analógica PWM de 8-bit com a função analogWrite().
SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estes pinos suportam comunicação SPI, que embora compatível com o hardware, não está incluída na linguagem do Arduino.
LED: 13. Há um LED já montado e conectado ao pino digital 13. Quando o pino está no valor HIGH, o LED acende; quando o valor está em LOW, ele apaga.
O Arduino UNO tem 6 entradas analógicas e cada uma delas tem uma resolução de 10 bits (i.e. 1024 valores diferentes). Por padrão, elas medem de 0 a 5 volts, embora seja possível mudar o limite superior usando o pino AREF e um pouco de código de baixo nível. Adicionalmente alguns pinos têm funcionalidades especializadas:
I2C: 4 (SDA) and 5 (SCL). Suportam comunicação I2C (TWI) usando a biblioteca Wire(documentação no site do WIRE).
Há ainda alguns outros pinos na placa:
AREF. Referência de voltagem para entradas analógicas. Usados comanalogReference().
Reset. Envie o valor LOW para resetar o microcontrolador. Tipicamente utilizados para adicionar um botão de reset aos shields que bloqueiam o que há na placa.
Veja também mapeando entre os pinos do Arduino e as portas do ATmega 168 ereferência do ATmega328.
Comunicação:
Com o Arduino UNO a comunicação com um computador, com outro Arduino ou com outros microcontroladores é muito simplificada. O ATmega328P permite comunicação serial no padrão UART TTL (5V), que está disponível nos pinos digitais 0 (RX) e 1 (TX).Um chip FTDI FT232RL na placa encaminha esta comunicação serial através do USB e os drives FTDI (incluído no software do Arduino) fornece uma porta COM virtual para o software no computador. O software Arduino inclui um monitor serial que permite que dados simples de texto sejam enviados à placa Arduino. Os LEDs RX e TX da placa piscam quando os dados estão sendo transferidos ao computador pelo chip FTDI e a conexão USB (mas não quando há comunicação serial pelos pinos 0 e 1).
A biblioteca SoftwareSerial permite comunicação serial por quaisquer dos pinos digitais do Arduino UNO.
O ATmega328P também oferece suporte aos padrões de comunicação I2C (TWI) e SPI. O software do Arduino inclui uma biblioteca Wire para simplificar o uso do bus I2C; veja a documentação no site do Wiring para mais detalhes. Para usar a comunicação SPI veja a folha de informações do ATmega328P.
Programação:
O Arduino UNOpode ser programado com o software Arduino (download).Para mais detalhes veja referência e tutoriais.
O ATmega328P no Arduino UNO vem pré-gravado com um bootloader que permite enviar novos programas sem o uso de um programador de hardware externo. Ele se comunica utilizando o protocolo original STK500 (referência, C header files).
Você também pode programar o ATmega328P através do ICSP (In-Circuit Serial Programming) header; veja estas instruções para mais detalhes.
Reset automático (Software):
Algumas versões anteriores do Arduino requerem um reset físico (pressionando o botão de reset na placa) antes de carregar um sketch. O Arduino UNO é projetado de modo a permitir que isto seja feito através do software que esteja rodando no computador conectado. Uma das linhas de controle de hardware (DTR) do FT232RL está conectada ao reset do ATmega328P via um capacitor de 100 nanofarads . Quando esta linha é resetada (ativo baixo) o sinal cai por tempo suficiente para resetar o chip. O software Arduino usa esta característica para permitir carregar o programa simplesmente pressionando o botão "upload" no ambiente Arduino. Isto significa que o "bootloader" pode ter um "timeout" mais curto, já que a ativação do DTR (sinal baixo) pode ser bem coordenada com o início do "upload".
Esta configuração tem outras implicações. Quando o Arduino UNO está conectado a um computador rodando Mac OS X ou Linux, ele reseta toda vez que a conexão é feita por software (via USB). No próximo meio segundo aproximadamente, o bootloader estará rodando no Arduino UNO. Considerando que é programado para ignorar dados espúreos (i.e. qualquer coisa a não ser um "upload" de um novo código), ele interceptará os primeiros bytes de dados sendo enviados para a placa depois que a conexão é aberta. Se um "sketch" rodando na placa recebe configuração de uma vez ou outros dados ao inicializar, assegure-se que o software que esteja comunicando espere um segundo depois de aberta a conexão antes de enviar estes dados.
O Arduino UNO tem uma trilha que pode ser cortada para desabilitar o auto-reset e pode ser ressoldada para reativá-lo. É chamada de "RESET-EN". Você pode também desabilitar o auto-reset conectando um resistor de 110 ohms dos +5V até o sinal de reset; veja este fórum para detalhes.
Proteção contra sobrecorrente USB:
O Arduino UNO tem um polifusível resetável que protege a porta USB do seu computador contra curto-circuito e sobrecorrente. Apesar da maioria dos computadores possuírem proteção interna própria, o fusível proporciona uma proteção extra. Se mais de 500mA foram aplicados na porta USB, o fusível irá automaticamente interromper a conexão até que o curto ou a sobrecarga seja removida.
Características físicas:
O comprimento e largura máximos do Arduino UNO são 2,7" (68,50 mm) e 2,1" (53,34 mm) respectivamente, com o conector USB e o jack de alimentação indo um pouco além destas dimensões. Três furos de fixação permitem a montagem da placa numa superfície ou caixa. Note que a distância entre os pinos de entrada e saída digitais nº 7 e nº 8 é de 160 mil (milésimos de polegada), não é sequer múltiplo do espaçamento de 100 mil dos outros pinos.…
\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:55:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_ANYEDGE' GPIO_PIN_INTR_ANYEDGE = 3, ^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:44:29: error: redeclaration of 'GPIO_PIN_INTR_LOLEVEL' GPIO_PIN_INTR_LOLEVEL = 4, ^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:56:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_LOLEVEL' GPIO_PIN_INTR_LOLEVEL = 4, ^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:45:29: error: redeclaration of 'GPIO_PIN_INTR_HILEVEL' GPIO_PIN_INTR_HILEVEL = 5 ^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:57:5: note: previous declaration 'GPIO_INT_TYPE GPIO_PIN_INTR_HILEVEL' GPIO_PIN_INTR_HILEVEL = 5 ^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:46:3: error: conflicting declaration 'typedef enum GPIO_INT_TYPE GPIO_INT_TYPE' } GPIO_INT_TYPE; ^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:58:3: note: previous declaration as 'typedef enum GPIO_INT_TYPE GPIO_INT_TYPE' } GPIO_INT_TYPE; ^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:54:68: error: conflicting declaration 'typedef void (* gpio_intr_handler_fn_t)(uint32, void*)' typedef void (* gpio_intr_handler_fn_t)(uint32 intr_mask, void *arg); ^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:67:17: note: previous declaration as 'typedef void (* gpio_intr_handler_fn_t)(uint32_t, bool, void*)' typedef void (* gpio_intr_handler_fn_t)(uint32_t intr_mask, bool high, void *arg); ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFiSTA.h:29:0, 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/user_interface.h:78:41: error: conflicting declaration of C function 'bool system_deep_sleep(uint64)' bool system_deep_sleep(uint64 time_in_us); ^In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0/tools/sdk/include/esp32/esp_system.h:21:0, 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/esp_sleep.h:264:6: note: previous declaration 'void system_deep_sleep(uint64_t)' void system_deep_sleep(uint64_t time_in_us) __attribute__((noreturn, deprecated)); ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:40:0, 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/WiFiServer.h:52:3: error: invalid abstract return type 'WiFiClient' WiFiClient available(uint8_t* status = NULL); ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39:0, 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/WiFiClient.h:45:7: note: because the following virtual functions are pure within 'WiFiClient': class WiFiClient : public Client, public SList<WiFiClient> { ^In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:155:0, from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:37:18: note: virtual void Client::flush() virtual void flush() = 0; ^C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:38:18: note: virtual void Client::stop() virtual void stop() = 0; ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/WiFiServerSecure.h:21:0, from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:41, 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/WiFiServerSecureBearSSL.h:58:5: error: invalid abstract return type 'BearSSL::WiFiClientSecure' WiFiClientSecure available(uint8_t* status = NULL); ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/WiFiServerSecureBearSSL.h:24:0, from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/WiFiServerSecure.h:21, from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:41, 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/WiFiClientSecureBearSSL.h:34:7: note: because the following virtual functions are pure within 'BearSSL::WiFiClientSecure': class WiFiClientSecure : public WiFiClient { ^In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:155:0, from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:37:18: note: virtual void Client::flush() virtual void flush() = 0; ^C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:38:18: note: virtual void Client::stop() virtual void stop() = 0; ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/WiFiServerSecure.h:20:0, from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:41, 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/WiFiServerSecureAxTLS.h:36:3: error: invalid abstract return type 'axTLS::WiFiClientSecure' WiFiClientSecure available(uint8_t* status = NULL); ^In file included from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/WiFiClientSecure.h:23:0, from C:\Users\amora\OneDrive\Documentos\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:42, 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/WiFiClientSecureAxTLS.h:33:7: note: because the following virtual functions are pure within 'axTLS::WiFiClientSecure': class WiFiClientSecure : public WiFiClient { ^In file included from C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Arduino.h:155:0, from sketch\ESP_-_Salva_Arquivo.ino.cpp:1:C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:37:18: note: virtual void Client::flush() virtual void flush() = 0; ^C:\Users\amora\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.0\cores\esp32/Client.h:38:18: note: virtual void Client::stop() virtual void stop() = 0; ^K:\!Kaie\!Laboratório\Arduino\!!Arduino Skatches\ESP_-_Salva_Arquivo\ESP_-_Salva_Arquivo.ino: In function 'void loop()':ESP_-_Salva_Arquivo:135:40: error: cannot allocate an object of abstract type 'WiFiClient'ESP_-_Salva_Arquivo:135:14: error: cannot declare variable 'client' to be of abstract type 'WiFiClient'exit status 1cannot allocate an object of abstract type 'WiFiClient'Este relatório teria mais informações com"Mostrar a saida detalhada durante a compilação"opção pode ser ativada em "Arquivo -> Preferências"…
Este tutorial procurará fornecer um grande exemplo do fascinante mundo do IoT, onde o que aprenderemos com o robô, poderá ser utilizado para controlar qualquer coisa pela…
Adicionado por Marcelo Rovai ao 0:28 em 2 junho 2016
guinte: tenho vários motores instalados em uma fábrica, estes motores possuem contatos auxiliares de alarme para informar quando um motor entrar em sobrecarga. Gostaria que o Arduíno Mega/Emissor recebesse o sinal (5V) destes contatos e me enviasse uma SMS informando que o motor está desarmado. A idéia básica é a seguinte:No Emissor:Eu recebo o sinal de 5V no pino 22 do arduino mega, por exemplo, recebendo este sinal eu escrevo na serial o valor "A".Eu recebo o sinal de 5V no pino 23 do arduino mega, por exemplo, recebendo este sinal eu escrevo na serial o valor "B". Eassim sucessivamente.No receptor (Arduíno Uno + Shield SIM 900 ICOMSAT 1.1):No receptor eu leio o que está escrito na serial e faço meu comando.Se ler o caracter 'A' na serial, envia SMS "M1 DESARMADO".Se ler o caracter 'B' na serial, envia SMS "M2 DESARMADO".O problemas destes códigos é que fica enviando SMS sem parar.
Vcs poderiam me dar uma luz para este caso? Segue abaixo os códigos:
//Arduino Mega (emissor)
byte contatoM1=22; //define o contato do motor M1byte contatoM2=23; //define o contato do motor M2byte contatoM3=24; //define o contato do motor M3byte contatoM4=25; //define o contato do motor M4byte contatoM5=26; //define o contato do motor M5byte contatoM6=27; //define o contato do motor M6byte contatoM7=28; //define o contato do motor M7byte contatoM8=29; //define o contato do motor M8byte contatoM9=30; //define o contato do motor M9byte contatoM10=31;//define o contato do motor M10byte contatoM11=32; //define o contato do motor M11byte contatoM12=33; //define o contato do motor M12byte contatoM13=34; //define o contato do motor M13byte contatoM14=35; //define o contato do motor M14byte contatoM15=36; //define o contato do motor M15byte contatoM16=37; //define o contato do motor M16byte contatoM17=38;//define o contato do motor M17byte A, B, C, D, E,F, G,H,I,J,L,M,N,O,Q,R,S;boolean enviouA, enviouB,enviouC, enviouD,enviouE, enviouF,enviouG, enviouH,enviouI, enviouJ,enviouL, enviouM,enviouN, enviouO,enviouQ, enviouR,enviouS=false; // flags booleanasbyte tx=1; // define o pino de saída Serial
boolean tempodecorte() { static unsigned long last_interrupt_time = 0; // define o tempo de referencia como zero unsigned long interrupt_time = millis(); // comeca a contagem do tempo if(interrupt_time - last_interrupt_time > 5000) // aplica a condição tempo de contagem maior que 5 s do que o tempo de referencia { last_interrupt_time = interrupt_time; // se a condicao é satisfeita redefine o tempo de referencia como o tempo de contagem return true; // e contabiliza o voto } return false; // se nao, nao contabiliza o voto }
void setup() { Serial.begin(9600); // inicializa o Serial com 9600 bauds pinMode(contatoM1, INPUT); pinMode(contatoM2, INPUT); pinMode(contatoM3, INPUT); pinMode(contatoM4, INPUT); pinMode(contatoM5, INPUT); pinMode(contatoM6, INPUT); pinMode(contatoM7, INPUT); pinMode(contatoM8, INPUT); pinMode(contatoM9, INPUT); pinMode(contatoM10, INPUT); pinMode(contatoM11, INPUT); pinMode(contatoM12, INPUT); pinMode(contatoM13, INPUT); pinMode(contatoM14, INPUT); pinMode(contatoM15, INPUT); pinMode(contatoM16, INPUT); pinMode(contatoM17, INPUT); pinMode(tx,OUTPUT); digitalWrite(tx,HIGH); // "liga" o pino de saída Serial } void loop() { A=digitalRead(contatoM1); B=digitalRead(contatoM2); C=digitalRead(contatoM3); D=digitalRead(contatoM4); E=digitalRead(contatoM5); F=digitalRead(contatoM6); G=digitalRead(contatoM7); H=digitalRead(contatoM8); I=digitalRead(contatoM9); J=digitalRead(contatoM10); L=digitalRead(contatoM11); M=digitalRead(contatoM12); N=digitalRead(contatoM13); O=digitalRead(contatoM14); Q=digitalRead(contatoM15); R=digitalRead(contatoM16); S=digitalRead(contatoM17); if(tempodecorte()){ // chama funcao para o tempo em que o botao deve ser pressionado para ser considerado um voto if(A==HIGH && enviouA == false){ Serial.write('A'); // armazena A no Serial enviouA = true; delay(5000); } if(A==LOW){ // se mudou o valor de A, altera a flag para quando mudar novamente ele enviar enviouA = false; } // o if do B não deve ter nada a ver com o A, pois são motores diferentes if(B==HIGH && enviouB == false){ Serial.write('B'); // armazena B no Serial enviouB = true; delay(5000); } if(B==LOW){ enviouB = false; } if(C==HIGH && enviouC == false){ Serial.write('C'); // armazena C no Serial enviouC = true; delay(5000); } if(C==LOW){ enviouC = false; } if(D==HIGH && enviouD == false){ Serial.write('D'); // armazena D no Serial enviouD = true; delay(5000); } if(D==LOW){ enviouD = false; } if(E==HIGH && enviouE == false){ Serial.write('E'); // armazena E no Serial enviouE = true; delay(5000); } if(E==LOW){ enviouE = false; } if(F==HIGH && enviouF == false){ Serial.write('F'); // armazena F no Serial enviouF = true; delay(5000); } if(F==LOW){ enviouF = false; } if(G==HIGH && enviouG == false){ Serial.write('G'); // armazena G no Serial enviouG = true; delay(5000); } if(G==LOW){ enviouG = false; } if(H==HIGH && enviouH == false){ Serial.write('H'); // armazena H no Serial enviouH = true; delay(5000); } if(H==LOW){ enviouH = false; } if(I==HIGH && enviouI == false){ Serial.write('I'); // armazena I no Serial enviouI = true; delay(5000); } if(I==LOW){ enviouI = false; } if(J==HIGH && enviouJ == false){ Serial.write('J'); // armazena J no Serial enviouJ = true; delay(5000); } if(J==LOW){ enviouJ = false; } if(L==HIGH && enviouL == false){ Serial.write('L'); // armazena L no Serial enviouL = true; delay(5000); } if(L==LOW){ enviouL = false; } if(M==HIGH && enviouM == false){ Serial.write('M'); // armazena M no Serial enviouM = true; delay(5000); } if(M==LOW){ enviouM = false; } if(N==HIGH && enviouN == false){ Serial.write('N'); // armazena N no Serial enviouN = true; delay(5000); } if(N==LOW){ enviouN = false; } if(O==HIGH && enviouO == false){ Serial.write('O'); // armazena O no Serial enviouO = true; delay(5000); } if(O==LOW){ enviouO = false; } if(Q==HIGH && enviouQ == false){ Serial.write('Q'); // armazena Q no Serial enviouQ = true; delay(5000); } if(Q==LOW){ enviouQ = false; } if(R==HIGH && enviouR == false){ Serial.write('R'); // armazena R no Serial enviouR = true; delay(5000); } if(R==LOW){ enviouR = false; } if(S==HIGH && enviouS == false){ Serial.write('S'); // armazena S no Serial enviouS = true; delay(5000); } if(S==LOW){ enviouS = false; } } }
//Receptor (Arduíno Uno + Shield SIM 900 ICOMSAT 1.1)#include "SIM900.h"#include <SoftwareSerial.h>#include "sms.h"#include "GSM.h"SMSGSM sms;boolean started=false;byte rx=0;char x=0;int pinState = 0;int powerkey = 9; int statuspin = 4;void setup() {Serial.begin(9600); pinMode(rx,INPUT); pinMode(statuspin, INPUT);pinMode(pinState, INPUT);pinMode(powerkey, OUTPUT);pinState = digitalRead(statuspin); if(pinState==LOW){ digitalWrite(powerkey, HIGH); delay(2000); digitalWrite(powerkey, LOW); delay(2000);} Serial.println("GSM Shield testing."); if (gsm.begin(2400)){ Serial.println("\nstatus=READY"); started=true; } else Serial.println("\nstatus=IDLE"); }void loop() { if(Serial.available()){ x = Serial.read(); { if (x =='A'){ sms.SendSMS("+559888021164", "M1 DESARMADO"); delay(5000); } if (x =='B'){ sms.SendSMS("+559888021164", "M2 DESARMADO"); delay(5000); } if (x =='C'){ sms.SendSMS("+559888021164", "M3 DESARMADO"); delay(5000); } if (x =='D'){ sms.SendSMS("+559888021164", "M4 DESARMADO"); delay(5000); } if (x =='E'){ sms.SendSMS("+559888021164", "M5 DESARMADO"); delay(5000); } if (x =='F'){ sms.SendSMS("+559888021164", "M6 DESARMADO"); delay(5000); } if (x =='G'){ sms.SendSMS("+559888021164", "M7 DESARMADO"); delay(5000); } if (x =='H'){ sms.SendSMS("+559888021164", "M8 DESARMADO"); delay(5000); } if (x =='I'){ sms.SendSMS("+559888021164", "M9 DESARMADO"); delay(5000); } if (x =='J'){ sms.SendSMS("+559888021164", "M10 DESARMADO"); delay(5000); } if (x =='L'){ sms.SendSMS("+559888021164", "M11 DESARMADO"); delay(5000); } if (x =='M'){ sms.SendSMS("+559888021164", "M12 DESARMADO"); delay(5000); } if (x =='N'){ sms.SendSMS("+559888021164", "M13 DESARMADO"); delay(5000); } if (x =='O'){ sms.SendSMS("+559888021164", "M14 DESARMADO"); delay(5000); } if (x =='Q'){ sms.SendSMS("+559888021164", "M15 DESARMADO"); delay(5000); } if (x =='R'){ sms.SendSMS("+559888021164", "M16 DESARMADO"); delay(5000); } if (x =='S'){ sms.SendSMS("+559888021164", "M17 DESARMADO"); delay(5000); } else{ x=0; } }}}
…
Adicionado por Edson Diniz ao 14:50 em 12 agosto 2014