/* @author Valentin CARRUESCO aka Idleman @url http://blog.idleman.fr @licence CC cc-by-nc-sa http://creativecommons.org/licenses/by-nc-sa/3.0/ @description ============ Ce code permet l'ouverture d'une porte à l'aide d'un simple code bluetooth transmis par votre téléphone/tablette etc... @hardware Vous devez envoyer ce code sur un atemga 328 (ou arduino quelquonque contenant l'atmega 328) relié à un composant bluetooth (ici bolutek uk350), à une carte relais (elle meme reliée a la gache electrique de votre porte) et à un bouton poussoir (pour l'ouverture manuelle coté interieur de la porte) @usage ====== Installez l'application Yana bluetooth sur votre téléphone/tablette et configurez là */ #include #include //Adresse du bus i2c utilisé #define MASTER_ADDRESS 0x12 //Pin TX (tranmsission) du composant bluetooth #define BLUETOOTH_TRANSMIT_PIN 9 //Pin RX (réception) du composant bluetooth #define BLUETOOTH_RECEIVE_PIN 8 //Pin data du relais #define RELAY_PIN 7 //Pin du bouton d'ouverture manuel #define BUTTON_PIN 11 //Délais d'ouverture (en ms) #define OPEN_DELAY 50000 String dataReceived = ""; int index = 0; char data[] = ""; String dataSended = ""; String badgeQueue = ""; //Iterateur pour le stockage des char bluetooth recus int j = 0; // caractere de stockage temporaire char tmp; // tableau de caractere du code bluetooth recu (à comparer avec allowed) char code[5]; //booleen indiquant le début d'un code boolean startcode; int buttonState = 0; // variable for reading the pushbutton status long debounceDelay = 50; // the debounce time; increase if the output flickers //Classe de gestion bluetooth (initialisée avec les pin tx/rx confuguré plus haut) SoftwareSerial BluetoothSerial(BLUETOOTH_TRANSMIT_PIN, BLUETOOTH_RECEIVE_PIN); //Fonction d'initialisation void setup() { //Initialisation du pin relais en sortie pinMode(RELAY_PIN, OUTPUT); //Initialisation du pin boutton en entrée pinMode(BUTTON_PIN, INPUT); //Initialisation de la console Serial.begin(9600); //Initialisation du bluetooth BluetoothSerial.begin(9600); Wire.begin(MASTER_ADDRESS); Wire.onReceive(receiveData); Wire.onRequest(sendData); Serial.write("Porte initialisée"); } //Boucle d'execution void loop() { /* TODO à revoir buttonState = digitalRead(BUTTON_PIN); if (buttonState == HIGH) { unlock(); } */ //Si une info bluetooth est captée if (BluetoothSerial.available()){ Serial.write("> "); // Tant qu'une lettre est transmise while(BluetoothSerial.available()){ //On récupere la lettre tmp = (char) BluetoothSerial.read(); //Si la lettre est '*' c'est qu'un code d'identification vas suivre, on met donc startcode à "true" Serial.write(tmp); if(tmp == '*') startcode = true; //Si startcode est à true et qu'on à pas encore récuperé les 4 lettres du code if(startcode && j<5){ //on stocke la lettre dans le tableau de comparaison code[j] = tmp; //on ajoute +1 à l'iterateur pour stocker la prochaine lettre j++; } } //Une fois le message bluetooth transmis, si un code à été transmis (si le caractere '*' à été trouvé) if(startcode){ Serial.write("\nTest du code : "); Serial.write(code); Serial.write("\n"); //On met le code en attente badgeQueue = code; BluetoothSerial.write("msg:code en queue"); startcode = false ; memset(code, 0, sizeof(code)); j=0; } } } //Fonction d'ouverture de la porte, ouvre la porte pendant un nombre de milisecondes définis dans les constantes en haut de fichier (5000ms = 5s) void unlock(){ Serial.write("\nOuverture de la porte"); BluetoothSerial.write("\ncmd:1"); digitalWrite(RELAY_PIN,1); delay(OPEN_DELAY); BluetoothSerial.write("\ncmd:0"); Serial.write("\nFermeture de la porte"); digitalWrite(RELAY_PIN,0); } void receiveData(int byteCount){ dataSended = ""; while(Wire.available()) { char c = Wire.read(); //Si la commande du rpi est entierement lue, on la traite if(c == '$'){ Serial.println("> "+dataReceived); if(dataReceived == "ping"){ // envois du badge en attente Serial.println("! Envois badge en attente"); dataSended = badgeQueue; badgeQueue = ""; }else if(dataReceived == "1"){ // ouverture de la porte unlock(); BluetoothSerial.write("\nmsg:code correct"); }else{ // mauvais badge Serial.println("! Mauvais badge"); BluetoothSerial.write("\nmsg:code incorrect"); } dataSended.toCharArray(data,dataSended.length() + 1); dataReceived = ""; }else{ dataReceived += c; } } } void sendData(){ if(data!=""){ Wire.write(data[index]); ++index; if (index >= strlen(data)+1) { index = 0; Wire.write('$'); } } }