Índice:

Despertador inteligente usando Magicbit (Arduino): 10 etapas
Despertador inteligente usando Magicbit (Arduino): 10 etapas
Anonim
Image
Image

Este tutorial mostra como fazer um despertador inteligente usando display OLED na placa de desenvolvimento Magicbit sem usar qualquer módulo RTC.

Suprimentos

  • Magicbit
  • Cabo USB-A para Micro-USB

Etapa 1: História

Neste tutorial, aprenderemos como fazer um despertador inteligente usando Magicbit.

Etapa 2: CONFIGURAÇÃO DE HARDWARE

Conecte seu Magicbit ao computador usando o cabo USB.

Etapa 3: CONFIGURAÇÃO DO SOFTWARE

Abra seu Arduino IDE e configure a placa com o Arduino IDE. O link a seguir mostra como fazer isso. Portanto, recomendamos que você primeiro acesse o link e se familiarize com o Magic bit.

magicbit-arduino.readthedocs.io/en/latest/…

Agora selecione o tipo de placa e porta corretos. Neste caso, o tipo de placa é Magicbit. As bibliotecas já estão instaladas nas bibliotecas do Magicbit.

Etapa 4: Teoria e Metodologia

Se você olhar o primeiro vídeo, verá que a tela tem 2 telas.

  • tela do relógio que mostra detalhes de tempo
  • tela de alarme que mostra os detalhes do alarme

Para alternar entre essas duas telas, usamos qualquer botão de pressão de dois no Magicbit. Esses botões são conectados aos pinos 35 (botão esquerdo) e 34 (botão direito) do ESP32 no Magicbit. Para mostrar a hora e outros detalhes, usamos um display OLED integrado no magicbit.

Vamos falar sobre como funcionam essas telas gráficas.

A tela do relógio possui texto analógico, relógio digital, data, mês e ano.

Para a criação de relógio analógico, usamos algumas funções gráficas que estão disponíveis na biblioteca de gráficos chamada Adafriut GFX. Usando a função de círculo e função de linha, criamos um relógio analógico. Funções geométricas simples chamadas sin e cos são usadas para a posição dos ponteiros do relógio. Portanto, apenas inserimos o ângulo que corresponde ao tempo para girar os ponteiros. para isso, primeiro convertemos o tempo para o ângulo da seguinte maneira.

  • ângulo do ponteiro dos minutos = minutos * (360/60)
  • ângulo do ponteiro das horas = horas * (360/12)

O ângulo medido em relação à linha entre o centro do mostrador do relógio e o número 12 no mostrador do relógio. Usando as funções sin e cos, podemos calcular as coordenadas xey das extremidades das linhas de horas e minutos. A imagem abaixo descreve como está se saindo.

De acordo com as coordenadas, imprimimos o ponteiro das horas e dos minutos desenhando linhas. Também existe a função de impressão de texto na biblioteca Adafruit GFX. Ajuda a imprimir outros detalhes (data, mês e hora mostrados em dígitos) no display. Você pode alterar a posição do relógio analógico e as posições do texto alterando os parâmetros no código.

Assim como na tela do relógio, usamos a função de impressão de texto na biblioteca Adafruit GFX para imprimir números no display OLED em locais apropriados.

Etapa 5: Obtendo a hora local

A parte mais importante do relógio é como obtemos a hora local com precisão. Para esse efeito, você pode usar o módulo de relógio RTC externo ou relógio RC embutido no ESP32 no Magicbit. Neste projeto usamos o segundo método. Neste método usamos o cliente NTP (protocolo de chamada de tempo de rede) para obter a hora local da Internet. Para acesso à Internet, usamos o recurso WIFI embutido no ESP32. Por isso, na primeira fase, usamos WIFI para acessar a Internet, fornecendo SSID e senha. Então devemos configurar o gmtOffset e daylightOffset em variáveis em segundos. Os valores dessas variáveis variam de região para região do mundo. gmtOffset significa o número de segundos em que você difere do GMT. Para a maioria do ares, daylightOffset é 3600. Você pode encontrá-lo na internet. Depois de obter a hora local atual, não usamos mais WIFI. Porque então calculamos a hora local a partir do relógio RC embutido no ESP32. Isso é feito usando a biblioteca time.h. Há um exemplo simples no Arduino (Arduino> Exemplos> ESP32> Time> simpletime) para você aprender mais sobre como isso funciona. Além disso, esses links podem ser usados para obter mais conhecimento sobre o cliente NTP.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

Depois de obter a hora local corretamente, mudamos nosso tempo mostrando textos e ângulos de acordo com a informação de tempo em cada loop.

Etapa 6: Configurando o Alarme

Ao clicar nos botões esquerdo e direito, você pode alterar a seleção da data e hora do alarme. Certifique-se de desligar o alarme ao alterar a data e a hora do alarme. Depois de configurar a data e a hora, ligue o alarme. Porque se o alarme estiver ligado e quando a hora do alarme for igual à sua hora atual enquanto você o configura, a campainha do alarme tocará. No loop principal, sempre verifica se a hora local atual e as informações de alarme são iguais. Se forem iguais, a campainha e o LED verde integrado no Magicbit funcionarão durante um minuto.

Etapa 7: Configurando o Buzzer

Usamos o pulso PWM para criar o som da campainha usando a função analogCwrite () no código. Por causa de todas as funções da biblioteca estão em ESP32 é válido para Magicbit. Você pode alterar o som do bipe da campainha de alterar sua frequência e valor de PWM no código.

techtutorialsx.com/2017/06/15/esp32-arduin…

Esta página descreve como funciona a campainha com ESP32.

Etapa 8: Configurando os botões

Para alterar todos os estados, usamos dois botões integrados no Magicbit. O loop principal sempre verifica o estado de dois botões. Como eles puxaram internamente, o estado normal é de sinal alto. Portanto, você pode ver que a leitura digital desses pinos é 1. No estágio padrão, o visor mostra a interface do relógio. Nesse momento, quando qualquer um dos dois botões é pressionado, ele muda a tela para a tela de alarme. Também contamos o tempo em segundos desde a última vez em que o botão foi pressionado. Se essa contagem for maior do que alguma duração predefinida, o visor mostrará a tela do relógio.

O código é escrito usando funções básicas para iniciantes. Portanto, o código é simples de entender e você pode aprender o método como ele funciona referindo-se ao código.

Etapa 9: Solução de problemas

Algumas vezes o relógio é iniciado um pouco mais tarde ou não exibe os gráficos corretamente. As dicas a seguir ajudam a resolver a situação.

  • Certifique-se de que forneceu o SSID e a senha corretos
  • Mude o servidor NTP (você pode encontrar muitos servidores da Internet que se relacionam com a sua região).
  • Altera a conexão com a Internet (também é possível um ponto de acesso móvel).

Além disso, você pode solucionar tudo usando o monitor serial. Além do display OLED, o monitor serial mostra as informações de tempo.

Etapa 10: Código Arduino

// bibliotecas para display OLED

#incluir

#include #include #define OLED_RESET 4 #include // biblioteca wi-fi para conectar #include "time.h" // biblioteca para usar relógio RC // define nomes de pinos de entrada e saída #define RightButton 34 #define LeftButton 35 #define GreenLED 16 # define Buzzer 25 int preTime = 0; contagens int = 0; int currentTime = 0; struct tm timeinfo; const char * ssid = "SEU SSID"; // detalhes do wi-fi const char * senha = "SUA SENHA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // variáveis de alarme int dateIndex = 0; int timeIndex = 0; int selectIndex = -1; bool buzzerOn = 0; reteto interno [6] [4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}}; // retângulo de seleção const char * ntpServer = "asia.pool.ntp.org"; // detalhes do servidor const long gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display (128, 64); // tamanho do OLED define byte clockCenterY = (display.height () + 16) / 2; // detalhes da face do relógio analógico byte clockCenterX = (display.height () - 16) / 2; byte clockRadius = 23; bool state = 0; // tela ligada ou desligada boolean Alarm = 0; // estado atual do alarme String alarmState = "Alarm ON"; // alarme ligado ou desligado // dados de tempo armazenados de variáveis char dayName [10]; char daynumber [3]; char mês [10]; char ano [5]; horas char [3]; minutos char [3]; char monthnumber [3]; segundos char [3]; // variáveis de botão bool RightState = 1; bool LeftState = 1; // variáveis da campainha int channel = 0; frequência int = 2000; int PWM = 200; resolução interna = 8; void setup () {// define entradas e saídas pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // inicializar o display display.display (); atraso (3000); display.clearDisplay (); ledcSetup (0, Freqüência, resolução); // configura os parâmetros pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // introduzir comunicação serial // conectar ao WiFi Serial.printf ("Conectando a% s", ssid); WiFi.begin (ssid, senha); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println ("CONECTADO"); // init e obtém a hora configTime (gmtOffset_sec, daylightOffset_sec, ntpServer); consiga tempo(); // desconecta o WiFi, pois não é mais necessário WiFi.disconnect (true); WiFi.mode (WIFI_OFF); display.clearDisplay (); } void loop () {getTime (); // obtém a hora atual // armazena os estados dos botões direito e esquerdo RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // verifique se os botões são pressionados if (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // quando o botão é pressionado, a campainha emite um sinal sonoro delay (100); if (state == 0) {// mudar para o estado do frame da tela de alarme = 1; // mudar o estado para o estado do alarme RightState = LeftState = 1; // só precisamos mudar o sceern} counts = 0; // redefinir o contador} se (estado == 1 && (contagens) <5) {// se na tela de alarme e sem tempo limite calculeAlarm (); // calcule valores de tempo de informações de alarme showAlarm (); // mostre valores} else {// se em relógio estado da tela = 0; display.clearDisplay (); clockFace (); // mostrador do relógio analógico printLocalTime (); // imprime a hora no mostrador do relógio e imprime outros detalhes} onAlarm (); // compare o horário do alarme com o horário local e liga o atraso do alarme (100); // atrasa para alarm on and off} void clockFace () {// caalog clock face display.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // imprimir círculo de relógio para (int digit = 0; digit = 5) {// tem apenas 5 selctions.so redefinir para -1 (-1 = alarme ativado ou desativado) selectIndex = -1; } dateAndTimeSelection (selectIndex); // mudar a seleção} void dateAndTimeSelection (int index) {if (index == -1) {// alarme ligado ou desligado if (RightState == 0) {// alternar entre alarme ligado e desligado se (alarmState == "Alarme LIGADO") {alarmState = "Alarme DESLIGADO"; } else {alarmState = "Alarme LIGADO"; }}} else {if (RightState == 0) {// em outras seleções incluir a data ou hora relacionada na matriz alarmDateTime [index] = alarmDateTime [index] + 1; // índice é a seleção}} int compare [4] = {12, 2030, 23, 59}; // limites superiores das datas e anos int comparemonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // limites superiores dos meses int resetValue [4] = {1, 2020, 0, 0}; // valores iniciais para (int i = 1; i compare [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> comparemonth [alarmDateTime [1] - 1]) {// redefine os valores se os meses forem maiores que seus limites alarmDateTime [0] = 1; }} void showAlarm () {// imprimir detalhes do alarme String alarmDateTime0 = String (alarmDateTime [0]); // converte stings para mostrar String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // se os valores tiverem 1 dígito, adicione "0" a eles. if (alarmDateTime [0]

Recomendado: