#define pinSignalDeSortie B00010000 // Masque binaire, permettant de sélectionner la broche D12 de l'Arduino Uno
#define freq0 200 // Fréquence 0 binaire à 200hz (minimum 20 max 20k)
#define freq1 500 // Fréquence 1 binaire 500hz (minimum 20 max 20k)
#define tailleMaxMessage 64
void setup() {
DDRB = DDRB | pinSignalDeSortie; // Déclare la broche D12 comme étant une "sortie"
Serial.begin(9600); // Initialise la communication série à 9600 bauds
}
String decToBin(int num) {
String result = ""; // Initialise une chaîne vide pour stocker le résultat binaire
// Comme c'est sur un octet, on parcours sur 8 bits
for (int i = 7; i >= 0; i--) {
if (num & (1 << i)) // Vérifie si le bit est défini à 1
result += "1"; // Si oui, ajoute "1" à la chaîne binaire
else
result += "0"; // Sinon, ajoute "0"
}
return result; // Retourne la chaîne binaire résultante
}
void loop() {
String message_binaire[tailleMaxMessage];
int taille_actuelle = 0;
char caractere = 0x00;
/* Première étape : attendre le message de l'utilisateur & convertir en fréquence */
do
{
caractere = 0x00;
if (Serial.available() > 0) //on vérifie si un caractère a été apuyé
{
caractere = Serial.read(); // Lecture du caractere entré
Serial.print("Caractere entré : ");
Serial.println(caractere); // Affiche le caractère
int code_ascii = (int)caractere; // Conversion en décimal
Serial.print("Code ASCII du caractere : ");
Serial.println(code_ascii); // Affiche le code ASCII
if (code_ascii != 10) // 10d = 0Ah = "Entrer"
{
String code_binaire = decToBin(code_ascii); // Conversion en binaire
Serial.print("Code binaire du caractere : ");
Serial.println(code_binaire); // Affiche la fréquence
message_binaire[taille_actuelle] = code_binaire; // On l'ajoute à la liste (Message complet)
taille_actuelle++;
}
}
}while((caractere != 0x0A) && (taille_actuelle < tailleMaxMessage)); // On reste dans la boucle tant que la touche "Entrer" (0x0A) n'est pas appuyé.
/* Deuxieme etape : Envoyer le message. */
for (int i=0; i<taille_actuelle; i++) // Pour chaque caractère/fréquence du message
{
for (int j=0; j<8; j++) // on lit chaque bit de l'octet
{
char bit_carac = message_binaire[i].charAt(j) ;//on prend le premier caractère puis le 2ème dans la boucle
float periodeDuSignal = 0.0;
if (bit_carac == '0')
{
// 0 binaire détecté
periodeDuSignal = (float) 1 / freq0;
} else {
// 1 binaire détecté
periodeDuSignal = (float) 1 / freq1;
}
float tempo = periodeDuSignal / 2;
// Génération du signal de sortie modulé
PORTB = PORTB | pinSignalDeSortie; // Met la sortie D12 à l'état haut (+5V)
_delay_us(tempo); // Délai avant de repasser à l'état bas
PORTB = PORTB & ~pinSignalDeSortie; // Met la sortie D12 à l'état bas (0V)
_delay_us(tempo); // Délai avant de repasser à l'état haut
}
}
}