Matériel :
* Carte Arduino UNO,
* Un afficheur à segments I2C TM1637,
* Un détecteur d’ultrasons de type SR04,
L’horloge est logicielle et ne nécessite pas d’autre matériel.
Principe :
En fonction de la détection de la proximité d’un objet ou d’un corps et en fonction de la distance augmente l’intensité de la luminosité de l’affichage.
Programmation :
Téléchargez la librairie de l’afficheur ici, celle du détecteur à ultrasons là et celle nécessaire à l’horloge logicielle ici.
Le sketch là.
/*******************************************************************************/
/* Horloge à Ultrasons
/* Détecte la proximité d'un objet ou d'un corps et en fonction de la distance
/* augmente l'intensité de la luminosité de l'affichage
/*******************************************************************************/
#include <TimerOne.h> //-- Librairie pour l'horloge
#include <Ultrasonic.h> //-- Librairie détection Ultrasons
#include "TM1637.h" //-- Librairie pour l'afficheur
#define ON 1
#define OFF 0
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
//-- Réglez ici l'heure d'initialisation de l'horloge
unsigned char second;
unsigned char minute = 04;
unsigned char hour = 19;
//-- Ultrasons
const int Trig = 3; // pin "Trig" du HC-SR04 connectée à pin 3 de l'Arduino
const int Echo = 2; // pin "Echo" du HC-SR04 connectée à pin 2 de l'Arduino
long cm; // variable pour stocker la distance de l'objet en cm
Ultrasonic HCSR04(Trig,Echo);
//-- Afficheur TM1637
#define CLK 4 // pins pour le TM1637
#define DIO 5
TM1637 tm1637(CLK,DIO);
//-- Setup
void setup()
{
tm1637.set();
tm1637.init();
Timer1.initialize(500000); //timing de 500ms
Timer1.attachInterrupt(TimingISR); //declaration de la routine d'interruption:TimingISR
}
//--
void loop()
{ //-- Si l'interruption est levée
if(Update == ON)
{ TimeUpdate();
tm1637.display(TimeDisp);
cm = HCSR04.convert(HCSR04.timing(), 1);
if(cm >0 && cm < 10) // objet très proche
{tm1637.set(0x07);}
else if(cm >= 10 && cm < 20) // distance moyenne
{tm1637.set(0x00);}
else if (cm>=20)
{tm1637.set(8);} //On efface l'afficheur (8 annule 88) !
}
}
//-- Routine d'interruption
void TimingISR()
{ halfsecond ++;
Update = ON;
if(halfsecond == 2){
second ++;
if(second == 60)
{
minute ++;
if(minute == 60)
{
hour ++;
if(hour == 24)hour = 0;
minute = 0;
}
second = 0;
}
halfsecond = 0;
}
ClockPoint = (~ClockPoint) & 0x01;
}
//-- Mise à jour de l'affichage
void TimeUpdate(void)
{ if(ClockPoint)tm1637.point(POINT_ON);
else tm1637.point(POINT_OFF);
TimeDisp[0] = hour / 10;
TimeDisp[1] = hour % 10;
TimeDisp[2] = minute / 10;
TimeDisp[3] = minute % 10;
Update = OFF;
}
Votre commentaire