Etape 8: Utilisez le CCF pour piloter les jauges
Il faut un code pour faire progresser les minutes et les heures et retourner les jauges à zéro lorsqu’ils max. C’est vraiment simple, mais je suis tombé sur un petit problème. Lorsque les aiguilles reviennent à zéro depuis leur voyage complet, ils le font avec assez de force. Assez pour faire une préoccupation de bruit et de la cause en cliquant sur la longévité des mouvements d’Arsonval dans les jauges. Je voulais mettre en place une routine retour douce dans le logiciel qui semblait à première vue assez facile à faire. J’ai finalement obtenir cela fonctionne et je vais vous montrer comment. Certains d'entre vous, les gourous de l’électronique pourraient être en mesure de déterminer une solution matérielle pour ce (frais de cap et les drains dans le cadre d’une diode résistance lorsque le PWM passe à zéro ou quelque chose). Dans l’affirmative, s’il vous plaît laissez-moi savoir. J’ai pris le chemin d’accès du logiciel et n’avez pas dépensé tout plus de temps à réfléchir à ce sujet.
Une petite vidéo du code ci-dessous en cours d’exécution. La trace de la O'scope est l’onde carrée du CCF. Avis chaque fois qu’il se lève, les incréments de main de secondes.
Voici un programme qui lit le CCF issu d’une interruption générée par l’onde carrée CCF attaché à la broche 2 de l’arduino et générer la valeur de secondes sur la broche 5 (PWM).
Cette routine ne comprend pas le retour de l’aiguille.
#include < Wire.h >
#define DS3231_I2C_ADDRESS 104
#define int_pin 2
#define gauge_pin 5
secondes de l’octet, minutes, heures, jour, date, mois, année ;
secpos octet ;
jour de semaine Char [4] ;
Boolean int_tick ;
tMSB octet, tLSB ;
float temp3231 ;
void setup()
{
Wire.Begin() ;
Serial.Begin(9600) ;
Wire.beginTransmission(DS3231_I2C_ADDRESS) ; 104 est l’adresse du périphérique DS3231
Wire.Send(0x0E) ; //
Wire.Send(B00000000) ;
Wire.endTransmission() ;
pinMode (int_pin, entrée) ;
digitalWrite(2,HIGH) ; Montez sur l’arrachage de la broche 2
attachInterrupt (0, int0handler, RISING) ; fixer l’interruption zéro à la broche 2 et appeler la fonction int0handler chaque fois que la broche 2 voit une tension croissante
secpos = 0 ;
}
void loop()
{
Si {(int_tick)
updategauge() ;
}
watchConsole() ; utilisé pour modifier l’heure et la date
}
void int0handler() {}
int_tick = 1 ;
}
void updategauge() {}
Serial.println("int") ;
get3231Date() ;
Serial.Print(weekDay) ; Serial.Print (",") ; Serial.Print (mois, DEC) ; Serial.Print("/") ; Serial.Print (date, DEC) ; Serial.Print("/") ; Serial.Print (année, DEC) ; Serial.Print ("-") ;
Serial.Print (heures, DEC) ; Serial.Print(":") ; Serial.Print (minutes, DEC) ; Serial.Print(":") ; Serial.Print (secondes, DEC) ;
Serial.Print ("température:") ; Serial.println(get3231Temp()) ;
secpos = secondes * 4 ;
Si (secpos > = 240) secpos = 0 ; Ceci renverra la deuxième aiguille à la fin du voyage
analogWrite (gauge_pin, secpos) ;
int_tick = 0 ; réinitialiser l’indicateur de tique int
}
Convertir des nombres décimaux normales en décimale codée en binaire
decToBcd(byte val) octets
{
Return ((val/10 * 16) + (10 % de val)) ;
}
Sub watchConsole()
{
Si (Serial.available()) {/ / Look de char dans la file d’attente de série et les processus si trouvé
Si (Serial.read() == 84) {//If command = « T » régler la Date
set3231Date() ;
get3231Date() ;
Serial.println("") ;
}
}
}
Sub set3231Date()
{
T(sec)(min)(Hour)(DayOfWeek)(DayOfMonth)(month)(Year)
T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
Exemple: 2 février 09 @ 19:57:11 pour le 3e jour de la semaine -> T1157193020209
secondes = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ; Utilisation de mathématique de coulée et ascii de type (octet) pour atteindre le résultat.
minutes = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
heures = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
jour = (octets) (Serial.read() - 48) ;
Date = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
mois = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
an = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
Wire.beginTransmission(DS3231_I2C_ADDRESS) ;
Wire.Send(0x00) ;
Wire.Send(decToBcd(seconds)) ;
Wire.Send(decToBcd(minutes)) ;
Wire.Send(decToBcd(hours)) ;
Wire.Send(decToBcd(Day)) ;
Wire.Send(decToBcd(date)) ;
Wire.Send(decToBcd(month)) ;
Wire.Send(decToBcd(Year)) ;
Wire.endTransmission() ;
}
Sub get3231Date()
{
Envoyer demande de recevoir des données à partir de Registre 0
Wire.beginTransmission(DS3231_I2C_ADDRESS) ; 104 est l’adresse du périphérique DS3231
Wire.Send(0x00) ; commencer au registre 0
Wire.endTransmission() ;
Wire.requestFrom (DS3231_I2C_ADDRESS, 7) ; demande sept octets
{if(Wire.available())}
secondes = Wire.receive() ; Obtenez secondes
minutes = Wire.receive() ; obtenir des minutes
heures = Wire.receive() ; Obtenez heures
jour = Wire.receive() ;
Date = Wire.receive() ;
mois = Wire.receive() ; mois de Temp
an = Wire.receive() ;
secondes = (((seconds & B11110000) >> 4) * 10 + (secondes & B00001111)) ; convertir BCD décimal
minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111)) ; convertir BCD décimal
heures = (((hours & B00110000) >> 4) * 10 + (heures & B00001111)) ; convertir BCD décimal (suppose que le mode 24 heures)
jour = (jour & B00000111) ; 1-7
Date = (((date & B00110000) >> 4) * 10 + (date & B00001111)) ; 1-31
mois = (((month & B00010000) >> 4) * 10 + (mois & B00001111)) ; msb7 est le débordement de siècle
an = (((year & B11110000) >> 4) * 10 + (an & B00001111)) ;
}
else {}
oh noes, aucune donnée !
}
commutateur (jour) {}
cas 1 :
strcpy (jours de la semaine, « Le soleil ») ;
rupture ;
cas 2 :
strcpy (jours de la semaine, « Mon ») ;
rupture ;
cas 3 :
strcpy (jours de la semaine, « Mar ») ;
rupture ;
cas 4 :
strcpy (jours de la semaine, "mercredi") ;
rupture ;
cas no 5 :
strcpy (jours de la semaine, « Jeu ») ;
rupture ;
cas 6 :
strcpy (jours de la semaine, « Fri ») ;
rupture ;
cas 7 :
strcpy (jours de la semaine, "assis") ;
rupture ;
}
}
flotteur get3231Temp()
{
registres de Temp (11h - 12h) obtenir mis à jour automatiquement chaque 64 s
Wire.beginTransmission(DS3231_I2C_ADDRESS) ;
Wire.Send(0x11) ;
Wire.endTransmission() ;
Wire.requestFrom (DS3231_I2C_ADDRESS, 2) ;
{if(Wire.available())}
tMSB = Wire.receive() ; 2 compléter la partie int
tLSB = Wire.receive() ; partie de la fraction
temp3231 = (tMSB & B01111111) ; 2 math sur Tmsb
temp3231 += ((tLSB >> 6) * 0,25) ; seulement se soucient de bits 7 & 8
}
else {}
oh noes, aucune donnée !
}
Return temp3231 ;
}