// // ######################### // # MINITEL BRANCHEMENT # // # Logo Arduino # // ######################### // # Guy Magli 09.08.2019 # // # Conception, cablages # // # mises a jour, # // # contact... # // # www.magli.fr # // ######################### // // Afin d'eviter les problemes d'affichage et d'impression les signes diacritiques // ont ete retires des commentaires et des chaines de caracteres. // // : ------------------------------- : // : Reglages a faire sur le Minitel : // : ------------------------------- : // // FNCT+P 1 pour regler la vitesse // FNCT+T V pour choisir le mode Videotex // // ! ======================== ! // ! Librairies et parametres ! // ! ======================== ! // #include #include #include #include // // Adresse Mac du bouclier // byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192, 168, 1, 39); // Trouvee grace a IPSCAN. Voir la page ci-dessous // www.advanced-ip-scanner.com/fr // // Adresse des serveurs // char cServerEnvoi[] = "smtp.bbox.fr"; // A changer selon votre box. Voir la page ci-dessous int iPort = 25; // A changer selon votre box // www.commentcamarche.net/faq/893-parametres-de-serveurs-pop-imap-et-smtp-des-principaux-fai char cServerLecture[] = "www.magli.eu"; // // Initialisation de la librairie client // EthernetClient cClientEnvoi; // Pour l'envoi des mails EthernetClient cClientLecture; // Pour la lecture des parametres // // ! ================================================= ! // ! VARIABLES GLOBALES, CONSTANTES ET INITIALISATIONS ! // ! ================================================= ! // int iNumLigne = 0; // Numero de la ligne du message int iColonneSaisie = 0; // Colonne ou faire clignoter le curseur int iLigneSaisie= 0; // Ligne ou faire clignoter le curseur int iNombreCaracteresSaisis = 0; // Nombre de caracteres deja saisis int t = 0; // Pour boucles unsigned long iTouche = 0; // Touche tapee au clavier du Minitel unsigned long iToucheFonction = 0; // Idem pour une touche de fonction unsigned long iMillisDebut = 0; // Pour faire clignoter un curseur unsigned long iMillisEnCours = 0; // Idem String cTouche = ""; // Touche saisie sur le clavier du Minitel String cTexte = ""; // Texte saisi au clavier du Minitel String cAdresse1 = ""; // Partie avant arrobas String cAdresse2 = ""; // Partie apres arrobas cAdresse1@cAdresse2 String cObjet = ""; // Objet du message String cMessage[11]; // 10 lignes (de 39 caracteres) du message String cCurseurPLein = "_"; // Pour faire clignoter un curseur String cCurseurVide = "."; // Idem String cCurseur = "_"; // Idem const String VIDE = "."; // Minitel minitel(Serial1); // Le port serie materiel de l'ATMega 1284P (RXD2 TXD2). // // ! ===== ! // ! Setup ! // ! ===== ! // void setup() { pinMode(18, OUTPUT); // Tx1 pinMode(19, INPUT_PULLUP); // Rx1 minitel.changeSpeed(minitel.searchSpeed()); // // Debut de la connexion Internet // Ethernet.begin(mac); // // Delai d'initialisation du bouclier // delay(3000); } // // ! ==== ! // ! Loop ! // ! ==== ! // void loop() { minitel.newScreen(); newPage("Envoi de courriels depuis un Minitel"); // minitel.textMode(); // Titre minitel.moveCursorXY(1, 3); minitel.attributs(DOUBLE_HAUTEUR); minitel.attributs(CARACTERE_BLANC); minitel.print("MINITE"); minitel.attributs(CARACTERE_BLEU); minitel.print("MAI"); minitel.attributs(CARACTERE_BLANC); minitel.println("L"); // Consigne minitel.attributs(GRANDEUR_NORMALE); minitel.attributs(CARACTERE_ROUGE); minitel.moveCursorXY(23, 3); minitel.println(" FNCT+T E pour"); minitel.moveCursorXY(23, 4); minitel.println("supprimer l'echo"); // Dessin d el'enveloppe minitel.attributs(CARACTERE_BLANC); minitel.attributs(INVERSION_FOND); minitel.moveCursorXY(15, 3); minitel.print("\\__/"); minitel.moveCursorXY(15, 4); minitel.print(" "); minitel.attributs(FOND_NORMAL); // Adresse mail minitel.attributs(GRANDEUR_NORMALE); minitel.attributs(CARACTERE_BLEU); minitel.moveCursorXY(1, 6); minitel.println("Adresse :"); minitel.moveCursorXY(1,7); minitel.print("............[Suite]"); minitel.attributs(CARACTERE_BLANC); minitel.moveCursorXY(20, 7); minitel.print("@"); minitel.attributs(CARACTERE_BLEU); minitel.moveCursorXY(21, 7); minitel.print("...........[Suite]"); minitel.moveCursorXY(1,9); minitel.print("Objet :"); minitel.moveCursorXY(1, 10); minitel.print("...............................[Suite]"); minitel.moveCursorXY(1, 12); minitel.print("Message :"); minitel.moveCursorXY(1, 13); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Suite]"); minitel.println("...............................[Envoi]"); minitel.attributs(CARACTERE_BLANC); cAdresse1 = lectureSaisie(1, 7, 18); cAdresse2 = lectureSaisie(21, 7, 18); minitel.moveCursorXY(1, 7); minitel.print(" "); minitel.moveCursorXY(1, 7); cAdresse1.toLowerCase(); cAdresse2.toLowerCase(); minitel.print(cAdresse1 + "@" + cAdresse2); cObjet = lectureSaisie(1, 10, 39); minitel.moveCursorXY(1, 10); minitel.print(" "); minitel.moveCursorXY(1, 10); minitel.print(cObjet); iToucheFonction = 0; iNumLigne = 1; for (t = 1; t <= 10; t++) { cMessage[t] = ""; } while ((iToucheFonction != ENVOI) && (iNumLigne <= 10)) { cMessage[iNumLigne] = lectureSaisie(1, iNumLigne + 12, 39); minitel.moveCursorXY(1, iNumLigne + 12); minitel.print(" "); minitel.moveCursorXY(1, iNumLigne + 12); minitel.print(cMessage[iNumLigne]); iNumLigne++; } for (t = iNumLigne; t <= 10; t++) { minitel.moveCursorXY(1, t + 12); minitel.print(" "); minitel.moveCursorXY(1, t + 12); minitel.print(cMessage[t]); } minitel.moveCursorXY(1, 24); minitel.print("Envoi en cours..."); envoieMail(); } // // ! ========== ! // ! Procedures ! // ! ========== ! // // : ------------- : // : Nouvelle page : // : ------------- : // void newPage(String titre) { minitel.newScreen(); minitel.println(titre); for (int i = 1; i <= 40; i++) { minitel.writeByte(0x7E); } minitel.moveCursorReturn(1); } // // : ----------------- : // : Saisie d'un champ : // : ----------------- : // String lectureSaisie(int iColonneSaisie, int iLigneSaisie, int iLongueurMax) { iNombreCaracteresSaisis = 0; cTexte = ""; minitel.moveCursorXY(iColonneSaisie, iLigneSaisie); boolean bFin = false; iMillisDebut = millis(); while (!bFin) // Tant que la saisie n'est pas terminee { minitel.moveCursorXY(iColonneSaisie + iNombreCaracteresSaisis, iLigneSaisie); minitel.print(cCurseur); // On affiche le curseur iMillisEnCours = millis(); if (iMillisEnCours - iMillisDebut >= 500) // Toutes les demi-secondes { if (cCurseur == cCurseurVide) { cCurseur = cCurseurPLein; // On affiche le curseur } else { cCurseur = cCurseurVide; // On efface le curseur } iMillisDebut = millis(); } iTouche = minitel.getKeyCode(); if (iTouche !=0 ) { if ((iTouche != SUITE) && (iTouche != ENVOI)) // Si ce n'est pas une touche de fin de saisie { if ((iTouche != CORRECTION) && (iTouche != ANNULATION)) // On ne corrige pas { if (iNombreCaracteresSaisis < iLongueurMax) { cTouche = char(iTouche); cTexte += cTouche; minitel.moveCursorXY(iColonneSaisie + iNombreCaracteresSaisis, iLigneSaisie); minitel.print(cTouche); iNombreCaracteresSaisis++; } } else // On corrige ou on annule { if (iTouche == CORRECTION) { // On met un point a l'endroit ou on se trouve minitel.moveCursorXY(iColonneSaisie + iNombreCaracteresSaisis, iLigneSaisie); minitel.attributs(CARACTERE_BLEU); minitel.print("."); minitel.attributs(CARACTERE_BLANC); // Un caractere de moins a ete saisi if (iNombreCaracteresSaisis >= 1) { iNombreCaracteresSaisis--; } // On efface le caractere a l'ecran minitel.moveCursorXY(iColonneSaisie + iNombreCaracteresSaisis, iLigneSaisie); minitel.print(" "); // Et la chaine de caracteres doit etre reduite cTexte = cTexte.substring(0, iNombreCaracteresSaisis); } if (iTouche == ANNULATION) { // On met un point a l'endroit ou on se trouve minitel.moveCursorXY(iColonneSaisie + iNombreCaracteresSaisis, iLigneSaisie); minitel.attributs(CARACTERE_BLEU); minitel.print("."); minitel.attributs(CARACTERE_BLANC); // On efface la ligne a l'ecran en mettant autant de points que necessaire for (t = 1; t <= iNombreCaracteresSaisis; t++) { minitel.moveCursorXY(iColonneSaisie + t - 1, iLigneSaisie); minitel.print("."); } // Plus aucun caractere n'est saisi iNombreCaracteresSaisis = 0; // Et la chaine de caracteres doit etre videe cTexte = ""; } } } else { if (iTouche == SUITE ) { iToucheFonction = SUITE; } else { iToucheFonction = ENVOI; } bFin = true; } } } return cTexte; } // // : ------------------------ : // : RECEPTION DES CARACTERES : // : ------------------------ : // byte receptionCaracteres() { byte codeDeReponse; byte octet; int compteur = 0; while (!cClientEnvoi.available()) { delay(1); compteur++; // Si on ne recoit rien if (compteur > 10000) { cClientEnvoi.stop(); return 0; } } codeDeReponse = cClientEnvoi.peek(); while (cClientEnvoi.available()) { octet = cClientEnvoi.read(); } if (codeDeReponse >= '4') { abandon(); return 0; } return 1; } // void abandon() { byte octet = 0; int compteur = 0; cClientEnvoi.println(F("QUIT")); while (!cClientEnvoi.available()) { delay(1); compteur++; // Si on ne recoit rien if (compteur > 10000) { cClientEnvoi.stop(); return; } } while (cClientEnvoi.available()) { octet = cClientEnvoi.read(); } cClientEnvoi.stop(); } void envoieMail() { String cTexteCourriel = ""; // Le texte du courriel qui sera compose ensuite if (cClientEnvoi.connect(cServerEnvoi, iPort) == 1) { } else { return 0; } if (!receptionCaracteres()) return 0; cClientEnvoi.println("EHLO 192.168.1.38"); // Ce n'est pas une faute de frappe EHLO et IP de l'Arduino if (!receptionCaracteres()) return 0; cClientEnvoi.println("MAIL From: "); if (!receptionCaracteres()) return 0; cClientEnvoi.println("RCPT To: <" + cAdresse1 + "@" + cAdresse2 + ">"); if (!receptionCaracteres()) return 0; cClientEnvoi.println("DATA"); if (!receptionCaracteres()) return 0; // cClientEnvoi.println("To: "); cClientEnvoi.println("To: <" + cAdresse1 + "@" + cAdresse2 + ">"); cClientEnvoi.println("From: "); cClientEnvoi.println("Subject: " + cObjet + "\r\n"); for (t = 1; t <= 10; t++) { cTexteCourriel.concat(cMessage[t] + "\r\n"); } cClientEnvoi.println(cTexteCourriel); cClientEnvoi.println("."); if (!receptionCaracteres()) return 0; cClientEnvoi.println("QUIT"); if (!receptionCaracteres()) return 0; cClientEnvoi.stop(); minitel.moveCursorXY(1, 24); minitel.print("Envoi termine ! "); delay(5000); }