Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Relógio de 7 segmentos com Arduino Nano + DS3231 + LDR

Componentes e suprimentos

Arduino Nano R3
funciona bem com Arduino Uno ou Elegoo Uno
× 1
Adafruit Mochila de 7 segmentos - 1,2 "Dígitos altos
- 1,2 "Dígitos altos no meu caso (opcional se você comprar o pacote)
× 1
Adafruit 1.2 Display de 4 dígitos e 7 segmentos com mochila I2C - Verde
× 1
Adafruit DS3231
ou DS1307 se preferir
× 1
Resistor 100k ohm
× 1
Resistor de foto
× 1
Breadboard (genérico)
× 1
Fios de jumpers (genérico)
10-14 peças
× 1
Bateria de célula tipo moeda CR1220
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto





Introdução


Em tempos em que você sempre tem um relógio no pulso, seja um relógio no pulso ou um smartphone, o Arduino Uno / Nano é um pouco chato. Caso contrário, você tem dispositivos sincronizados com servidor NTP neste artigo externos, que estão constantemente online por meio de sua conexão com a Internet.





História


Um de meus amigos recusou por motivos pessoais um dispositivo com conexão WiFi em seu quarto, então tenho o Arduino equipado com um relógio separado.





Escolha o produto certo


Fiquei surpreso com a quantidade de produtos diferentes que até mesmo a Adafruit tinha disponíveis:dependendo da tensão desejada, bem como com diferentes precisões! Aqui, decidi por dois produtos:o mais barato DS1307 e o provavelmente mais preciso DS3231 .

Para ser claro:ambos os produtos podem ser usados ​​neste relógio. Para usar o DS1307, preste atenção à atribuição correta do PIN e à restrição à opção de exibição de temperatura: observação "//" the displayTemp (); função dentro do loop ().





Adapte o esboço


Procurei um esboço e encontrei algo com outro membro. Reestruturei e ajustei este esboço, mas mantive seus comentários tchecos e adicionei comentários em inglês.

O anúncio deveria ser o maior possível, então decidi por um anúncio de 7 segmentos:afinal, eu só queria ter o tempo em mente.

A próxima surpresa positiva que tive ao revisar os esboços:aqui, o DS3231 oferece a opção de usar a temperatura , que o DS1307 - além de sua imprecisão - faltou.





Inicie os relógios


Se você tem uma bateria tipo botão CR1220, pode seguir o breve tutorial de Adafruit sobre como configurar os relógios. Em resumo, o tempo não é baixado da Internet, mas com o tempo do PC local. O carimbo de data / hora do upload é transferido para os cronômetros.





Funções


Depois, adicionei a matriz de LED ao circuito para saída de tempo e temperatura . O período de mudança de tempo e temperatura pode ser definido por meio de variáveis.

Em particular, como o controle individual - piscando - pontos e dígitos na matriz de LED funciona e é controlado, é bem descrito no esboço.

Aqui me refiro a mais fontes Adafruit.

O esboço é finalizado pelo ajuste do horário de verão / inverno e o brilho da matriz de LED dependendo da luz ambiente (à noite, o visor deve ser mais escuro do que à luz do dia).

No vídeo, você certamente notou a mudança de tempo e temperatura. Você prestou atenção no ponto à esquerda da imagem? Isso muda sua posição (para cima ou para baixo) dependendo dos segundos.

Dê-me um feedback se souber como emitir um "ERR" na matriz do LED em caso de falha do relógio. No momento "bEEF" aparecerá:
  // oh não, sem dados! Serial.println ("Erro do sensor DS3231 - não é possível ler a temperatura"); matrix.print (0xBEEF, HEX); // informe ao usuário com BEEF matrix.writeDisplay (); atraso (5000);  





Expansão


Um alarme ou hora de alarme também não está integrado ainda.

Possivelmente também consegue uma extensão via módulo Bluetooth e Blynk.





Atualização 01/02/2019:


A transferência do breadboard para uma aposta permanente em um cartão perfurado foi concluída hoje. Algumas fotos para os interessados:

Você encontrará um código v1.1 atualizado no anexo, bem como uma imagem de frizing personalizada.

Código

  • MyClock v1.0
  • MyClock v1.1
MyClock v1.0 C / C ++
 // MyClock v1.0 // Ingo Lohs // Hardware:testado com Arduino Uno e Arduino Nano (ATmega328P [Old Bootloader]) usando Arduino IDE v1.8.8 / * Teoria da Matriz ht16k33O mais fácil é apenas chamar print - assim como você faz com Serialprint (variável, HEX) - isso irá imprimir um número hexadecimal, de 0000 até FFFFprint (variável, DEC) ou print (variável) - isso irá imprimir um número inteiro decimal, de 0000 até 9999Se você precisa de mais controle, você pode chamar writeDigitNum (local, número) - isso escreverá o número (0-9) em um único local. O local # 0 está totalmente à esquerda, o local # 2 são os pontos de dois pontos, então você provavelmente deseja ignorá-lo, o local nº 4 está totalmente à direita. Para controlar os dois pontos e os pontos decimais, use a função writeDigitRaw (local, bitmap). (Observe que os dois pontos do centro estão ligados internamente ao visor , por isso não é possível endereçá-los separadamente.) Especifique 2 para a localização e os bits são mapeados da seguinte forma:0x02 - dois pontos centrais (ambos d ots) 0x04 - dois pontos esquerdo - ponto 0x08 inferior - dois pontos esquerdo - ponto superior 0x10 - ponto decimal Se você quiser um ponto decimal, chame writeDigitNum (localização, número, verdadeiro) que pintará o ponto decimal. Para desenhar os dois pontos, use drawColon (verdadeiro ou false) Se você deseja controle total dos segmentos em todos os dígitos, você pode chamar writeDigitRaw (localização, máscara de bits) para desenhar uma máscara de 8 bits bruta (como armazenada em um uint8_t) para qualquer local. Todas as rotinas de desenho mudam apenas a exibição memória mantida pelo Arduino. Não se esqueça de chamar writeDisplay () após desenhar para 'salvar' a memória na matriz via I2C.Source:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf * / # include  // Habilite esta linha se estiver usando Arduino Uno, Mega, etc. # include  #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // Fotoresistor LDR com 100k Ohm para GND, outra perna 5Vint ldr_value =0; // valor LDR - var armazenar valorint brilho_matrix; // Luminosidade da matriz de LED - var store valueint threshold_brightness =400; // Thresholdint blinkrate_value =0; // LED Matrix blink rateint delay_matrix_time =20; // quanto tempo de exibição (20 segundos) int delay_matrix_temp =2000; // por quanto tempo exibir temp (2 seg) int blinky_dot =2; // não pisca nada - no lado esquerdo 2 matriz dotsAdafruit_7segment simples =Adafruit_7segment (); byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} byte bcdToDec (byte val) { return ((val / 16 * 10) + (val% 16));} void setup () {Serial.begin (9600); Wire.begin (); matrix.begin (0x70);} void loop () {lightBrightness (); // Brilho da matriz Justierung matrixBlinkrate (); // Mattrix-Blinkrate Jusitierung displayTime (); // exibe os dados do relógio em tempo real displayTemp (); // exibe a temperatura} void lightBrightness () {// setBrightness (brighness) - permite que você altere o brilho geral de toda a tela. 0 é o menos brilhante, 15 é o mais brilhante e é o que é inicializado pelo display quando você inicia ldr_value =analogRead (ldr_sensor); Serial.print ("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// medição de brilho vs Threshold brilho_matriz =0; // claro à luz do dia} else {brilho_matrix =15; // escuro à noite}} void matrixBlinkrate () {// blinkRate (taxa) - Você pode piscar o display inteiro. 0 não está piscando. 1, 2 ou 3 é para piscar do visor. matrix.blinkRate (blinkrate_value);} void displayTime () {matrix.setBrightness (brilho_matriz); matrix.clear (); // quanto tempo exibe o tempo na matriz em segundosfor (uint16_t i =0; i > Mudança para o horário de verão - último domingo de março às 2 horas if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(mês ==3) &&(hour ==2)) {// nastavení hodin na 3 hodinu // acerta o relógio para 3 horas setDS3231time (se, mi, 3, we, dm, mo, ye); } // změna času na zimní //>> Mude para o horário de inverno if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(mês ==10) &&(hora ==1) &&(ano! =1 )) {// rok použit jako indikace, že bylo léto // ano usado como uma indicação de que era set de verãoDS3231time (se, mi, ho, we, dm, mo, 1); } if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(mês ==10) &&(hora ==3) &&(ano ==1)) {// nastavení hodin na 2 hodinu a příznak na 0 // configura o relógio para 2 horas e sinaliza o ano para 0 setDS3231time (se, mi, 2, we, dm, mo, 0); } / * Especifique 2 para a localização e os bits são mapeados da seguinte forma:0x02 - dois pontos centrais (ambos os pontos) 0x04 - dois pontos esquerdo - ponto inferior 0x08 - dois pontos esquerdo - ponto superior 0x10 - ponto decimal * / / * controles de localização # 2 também a esquerda 2 pontos únicos como este (=pisca_dot):2 =pisca nada 3 =pisca nada 4 =pisca no canto superior esquerdo (único ponto superior) 5 =pisca no canto superior esquerdo (único ponto superior) 6 =pisca no canto superior esquerdo (único ponto superior ) + ambos os dois pontos no meio 7 =piscam no canto superior esquerdo (único ponto superior) + ambos os dois pontos no meio 8 =piscam no canto inferior esquerdo (único ponto inferior) 9 =piscam no canto inferior esquerdo (único ponto inferior) 10 =piscam no canto inferior esquerdo (único ponto inferior ) + ambos os dois pontos no meio 11 =piscam no canto inferior esquerdo (ponto inferior único) + ambos os dois pontos no meio 12 =piscam os dois dois pontos (ambos os pontos à esquerda) sem os dois dois pontos no meio * / // formato horas:_0:mm if (hora> 9) {matrix.writeDigitNum (0, (hora / 10), falso); matrix.writeDigitNum (1, (hora% 10), falso); // isso gravará o número (0-9) em um único local usando o módulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else {matrix.writeDigitNum ( 1, hora, falso); } // matrix.drawColon (true); // ambos os dois pontos no meio ativo:caso você não queira piscar os pontos restantes, você pode ativar os dois pontos aqui // dê aos segundos a chance de mostrar os pontos à esquerda if (se <=30) {blinky_dot =10; // pisca na parte inferior esquerda (único ponto inferior) + ambos os dois pontos no meio} else if (se> 30) {blinky_dot =6; // pisca no canto superior esquerdo (ponto superior único) + dois pontos no meio} matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum (3, (minuto / 10), falso); matrix.writeDigitNum (4, (minuto% 10), falso); matrix.writeDisplay (); // pontos duplos intermitentes por meio segundo delay (500); matrix.drawColon (false); matrix.writeDisplay (); atraso (500); }} void displayTemp () {matrix.setBrightness (brilho_matriz); matrix.clear (); byte temp =get3231Temp (); int abs_temp =abs (temp); // número absoluto de um valor matrix.writeDigitNum (1, (abs_temp% 10), false); // posição 1, valor 9, mostra decimal) if (temp <0) matrix.writeDigitRaw (0,64); if (temp <=-10) matrix.writeDigitRaw (2,12); // e se a temperatura for negativa, colocamos o sinal de menos no primeiro lugar. if (temp>
 =10) matrix.writeDigitNum (0, (abs_temp / 10), false); // posição 0, valor 1, mostra decimal) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp / 10), false); // posição 0, valor 1, mostrar decimal) // matrix.writeDigitRaw (2,0x10); // matriz de pontos decimal.writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw (4,57); // 57 ="C" matrix.writeDisplay (); // exibe os valores de temperatura na linha serial // zobrazí hodnoty teploty na seriove lince Serial.print ("Temperatura em C:"); Serial.println (get3231Temp ()); // +/- 3 Grad Celsius // quanto tempo exibe a temperatura na matriz em segundos de atraso (delay_matrix_temp);} void setDS3231time (byte segundo, byte minuto, byte hora, byte dayOfWeek, byte dayOfMonth, byte mês, byte ano) {/ / definir data e hora para DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // define a próxima entrada para começar no registro de segundos Wire.write (decToBcd (second)); // definir segundos Wire.write (decToBcd (minuto)); // definir minutos Wire.write (decToBcd (hora)); // definir horas Wire.write (decToBcd (dayOfWeek)); // definir o dia da semana (1 =Domingo, 7 =Sábado) Wire.write (decToBcd (dayOfMonth)); // definir data (1 a 31) Wire.write (decToBcd (mês)); // definir o mês Wire.write (decToBcd (ano)); // definir ano (0 a 99) Wire.endTransmission ();} void getDateDs3231 (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mês, byte * ano) {Wire. beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); * segundo =bcdToDec (Wire.read () &0x7f); * minuto =bcdToDec (Wire.read ()); * hora =bcdToDec (Wire.read () &0x3f); * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * mês =bcdToDec (Wire.read ()); * ano =bcdToDec (Wire.read ());} float get3231Temp () {byte tMSB, tLSB; float temp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); if (Wire.available ()) {tMSB =Wire.read (); // porção interna do complemento de 2 tLSB =Wire.read (); // porção da fração temp3231 =(tMSB &B01111111); // faça a matemática de 2 no Tmsb temp3231 + =((tLSB>> 6) * 0,25); // preocupa-se apenas com os bits 7 e 8 return temp3231; } else {// oh não, sem dados! Serial.println ("Erro do sensor DS3231 - não é possível ler a temperatura"); matrix.print (0xBEEF, HEX); // informe ao usuário com BEEF matrix.writeDisplay (); atraso (5000); }} 
MyClock v1.1 C / C ++
Atualizar Summer / Winter-Time
 // MyClock v1.1 // Ingo Lohs // Hardware:testado com Arduino Uno e Arduino Nano (ATmega328P [Old Bootloader]) usando Arduino IDE v1.8.8 // Alterar v1.0> v1.1 // dayOfWeek ==1 anstatt 7 abgeändert in displayTime () zur korrekten Ermittlung des Sonntages für die Zeitumstellung / * Teoria da Matriz ht16k33O mais fácil é apenas chamar de impressão - assim como você faz com Serialprint (variável, HEX) - isso irá imprimir um número hexadecimal, de 0000 até FFFFprint (variável, DEC) ou imprimir (variável) - isso irá imprimir um número inteiro decimal, de 0000 até 9999Se você precisar de mais controle, pode chamar writeDigitNum (localização, número) - isso escreverá o número (0-9) em um único local. O local nº 0 está totalmente à esquerda, o local nº 2 são os pontos de dois pontos, então você provavelmente deseja ignorá-lo, o local nº 4 é todo o caminho para à direita. Para controlar os dois pontos e os pontos decimais, use a função writeDigitRaw (localização, bitmap). (Observe que os dois pontos do centro estão ligados em terminal ao visor, portanto, não é possível endereçá-los separadamente.) Especifique 2 para a localização e os bits são mapeados da seguinte forma:0x02 - dois pontos centrais (ambos os pontos) 0x04 - dois pontos esquerdo - ponto inferior esquerdo - ponto esquerdo - ponto superior 0x10 - ponto decimal Se você quiser um ponto decimal, chame writeDigitNum (localização, número, verdadeiro) que irá pintar o ponto decimal. Para desenhar os dois pontos, use drawColon (verdadeiro ou falso). Se você deseja controle total dos segmentos em todos os dígitos, você pode chamar writeDigitRaw (location, bitmask) para desenhar uma máscara bruta de 8 bits (como armazenada em um uint8_t) para qualquer local. Todas as rotinas de desenho mudam apenas a memória de exibição mantida pelo Arduino. Não se esqueça de chamar writeDisplay () após desenhar para 'salvar' a memória na matriz via I2C.Source:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf * / # include  // Habilite esta linha se estiver usando Arduino Uno, Mega, etc. # include  #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // Fotoresistor LDR com 100k Ohm para GND, outra perna 5Vint ldr_value =0; // valor LDR - var armazenar valorint brilho_matrix; // Luminosidade da matriz de LED - var store valueint threshold_brightness =400; // Thresholdint blinkrate_value =0; // LED Matrix blink rateint delay_matrix_time =20; // quanto tempo de exibição (20 segundos) int delay_matrix_temp =2000; // por quanto tempo exibir temp (2 seg) int blinky_dot =2; // não pisca nada - no lado esquerdo 2 matriz dotsAdafruit_7segment simples =Adafruit_7segment (); byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} byte bcdToDec (byte val) { return ((val / 16 * 10) + (val% 16));} void setup () {Serial.begin (9600); Wire.begin (); matrix.begin (0x70);} void loop () {lightBrightness (); // Brilho da matriz Justierung matrixBlinkrate (); // Mattrix-Blinkrate Jusitierung displayTime (); // exibe os dados do relógio em tempo real displayTemp (); // exibe a temperatura} void lightBrightness () {// setBrightness (brighness) - permite que você altere o brilho geral de toda a tela. 0 é o menos brilhante, 15 é o mais brilhante e é o que é inicializado pelo display quando você inicia ldr_value =analogRead (ldr_sensor); Serial.print ("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// medição de brilho vs Threshold brilho_matriz =0; // claro à luz do dia} else {brilho_matrix =15; // escuro à noite}} void matrixBlinkrate () {// blinkRate (taxa) - Você pode piscar o display inteiro. 0 não está piscando. 1, 2 ou 3 é para piscar do visor. matrix.blinkRate (blinkrate_value);} void displayTime () {matrix.setBrightness (brilho_matriz); matrix.clear (); // quanto tempo exibe o tempo na matriz em segundosfor (uint16_t i =0; i > Mudança para o horário de verão - último domingo de março às 2 horas if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(mês ==3) &&(hour ==2)) {// nastavení hodin na 3 hodinu // acerta o relógio para 3 horas setDS3231time (se, mi, 3, we, dm, mo, ye); } // změna času na zimní //>> Mude para o horário de inverno if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(mês ==10) &&(hora ==1) &&(ano! =1 )) {// rok použit jako indikace, že bylo léto // ano usado como uma indicação de que era set de verãoDS3231time (se, mi, ho, we, dm, mo, 1); } if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(mês ==10) &&(hora ==3) &&(ano ==1)) {// nastavení hodin na 2 hodinu a příznak na 0 // configura o relógio para 2 horas e sinaliza o ano para 0 setDS3231time (se, mi, 2, we, dm, mo, 0); } / * Especifique 2 para a localização e os bits são mapeados da seguinte forma:0x02 - dois pontos centrais (ambos os pontos) 0x04 - dois pontos esquerdo - ponto inferior 0x08 - dois pontos esquerdo - ponto superior 0x10 - ponto decimal * / / * controles de localização # 2 também a esquerda 2 pontos únicos como este (=pisca_dot):2 =pisca nada 3 =pisca nada 4 =pisca no canto superior esquerdo (único ponto superior) 5 =pisca no canto superior esquerdo (único ponto superior) 6 =pisca no canto superior esquerdo (único ponto superior ) + ambos os dois pontos no meio 7 =piscam no canto superior esquerdo (único ponto superior) + ambos os dois pontos no meio 8 =piscam no canto inferior esquerdo (único ponto inferior) 9 =piscam no canto inferior esquerdo (único ponto inferior) 10 =piscam no canto inferior esquerdo (único ponto inferior ) + ambos os dois pontos no meio 11 =piscam no canto inferior esquerdo (ponto inferior único) + ambos os dois pontos no meio 12 =piscam os dois dois pontos (ambos os pontos à esquerda) sem os dois dois pontos no meio * / // formato horas:_0:mm if (hora> 9) {matrix.writeDigitNum (0, (hora / 10), falso); matrix.writeDigitNum (1, (hora% 10), falso); // isso gravará o número (0-9) em um único local usando o módulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else {matrix.writeDigitNum ( 1, hora, falso); } // matrix.drawColon (true); // ambos os dois pontos no meio ativo:caso você não queira piscar os pontos restantes, você pode ativar os dois pontos aqui // dê aos segundos a chance de mostrar os pontos à esquerda if (se <=30) {blinky_dot =10; // pisca na parte inferior esquerda (único ponto inferior) + ambos os dois pontos no meio} else if (se> 30) {blinky_dot =6; // pisca no canto superior esquerdo (ponto superior único) + dois pontos no meio} matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum (3, (minuto / 10), falso); matrix.writeDigitNum (4, (minuto% 10), falso); matrix.writeDisplay (); // pontos duplos intermitentes por meio segundo delay (500); matrix.drawColon (false); matrix.writeDisplay (); atraso (500); }} void displayTemp () {matrix.setBrightness (brilho_matriz); matrix.clear (); byte temp =get3231Temp (); int abs_temp =abs (temp); // número absoluto de um valor matrix.writeDigitNum (1, (abs_temp% 10), false); // posição 1, valor 9, mostra decimal) if (temp <0) matrix.writeDigitRaw (0,64); if (temp <=-10) matrix.writeDigitRaw (2,12); // e se a temperatura for negativa, colocamos o sinal de menos no primeiro lugar. if (temp>
 =10) matrix.writeDigitNum (0, (abs_temp / 10), false); // posição 0, valor 1, mostra decimal) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp / 10), false); // posição 0, valor 1, mostrar decimal) // matrix.writeDigitRaw (2,0x10); // matriz de pontos decimal.writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw (4,57); // 57 ="C" matrix.writeDisplay (); // exibe os valores de temperatura na linha serial // zobrazí hodnoty teploty na seriove lince Serial.print ("Temperatura em C:"); Serial.println (get3231Temp ()); // +/- 3 Grad Celsius // quanto tempo exibe a temperatura na matriz em segundos de atraso (delay_matrix_temp);} void setDS3231time (byte segundo, byte minuto, byte hora, byte dayOfWeek, byte dayOfMonth, byte mês, byte ano) {/ / definir data e hora para DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // define a próxima entrada para começar no registro de segundos Wire.write (decToBcd (second)); // definir segundos Wire.write (decToBcd (minuto)); // definir minutos Wire.write (decToBcd (hora)); // definir horas Wire.write (decToBcd (dayOfWeek)); // definir o dia da semana (1 =Domingo, 7 =Sábado) Wire.write (decToBcd (dayOfMonth)); // definir data (1 a 31) Wire.write (decToBcd (mês)); // definir o mês Wire.write (decToBcd (ano)); // definir ano (0 a 99) Wire.endTransmission ();} void getDateDs3231 (byte * segundo, byte * minuto, byte * hora, byte * dayOfWeek, byte * dayOfMonth, byte * mês, byte * ano) {Wire. beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); * segundo =bcdToDec (Wire.read () &0x7f); * minuto =bcdToDec (Wire.read ()); * hora =bcdToDec (Wire.read () &0x3f); * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * mês =bcdToDec (Wire.read ()); * ano =bcdToDec (Wire.read ());} float get3231Temp () {byte tMSB, tLSB; float temp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); if (Wire.available ()) {tMSB =Wire.read (); // parte interna do complemento de 2 tLSB =Wire.read (); // porção da fração temp3231 =(tMSB &B01111111); // faça a matemática de 2 no Tmsb temp3231 + =((tLSB>> 6) * 0,25); // only care about bits 7 &8 return temp3231; } else { // oh no, no data! Serial.println("DS3231 Sensor Error - cant read temperature"); matrix.print(0xBEEF, HEX); // inform the user with BEEF matrix.writeDisplay(); atraso (5000); }} 
Github
https://github.com/ILohs/MySketches

Esquemas

LDR path corrected

Processo de manufatura

  1. Relógio de visão pov do Arduino
  2. DIY mais simples relógio IV9 Numitron com Arduino
  3. Relógio de parede simples usando Adafruit 1/4 60 Ring Neopixel
  4. Relógio Arduino com horas de oração islâmica
  5. Relógio mestre
  6. Arduino Temp. Monitor e relógio em tempo real com tela 3.2
  7. Arduino Nano:Controle 2 motores de passo com joystick
  8. Arduino Apple Watch
  9. Relógio de matriz de 7 segmentos
  10. Despertador simples com DS1302 RTC