/* Sketch "Animation graphique modélisme naval" pour Arduino UNO ou Nano et ecran OLED monochrome I2C 128x32 Bibliothèque Adafruit GFX et SSD1306 Ecran OLED raccordé sur A4 et A5 pour l'I2C + 3,3v et Gnd pour l'alim Signal récepteur radio sur D2 */ #include <Wire.h> #include <Adafruit_SSD1306.h> #include <Adafruit_GFX.h> // OLED display TWI address #define OLED_ADDR 0x3C #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); double sint ; double cost ; double radt ; const float pi = 3.14159 ; double u ; // coordonnes du point sur le cercle (avec décimal) double v ; // coordonnes du point sur le cercle (avec décimal) int x1; // coordonnes du point sur le cercle arrondi int y1; // coordonnes du point sur le cercle arrondi int x0 = 21; // coordonnes du centre du cercle int y0 = 16; // coordonnes du centre du cercle int r = 18; // rayon du cercle int t ; // variable de boucle int TRY0; // variable pour coordonnées triangle int TRY1; // variable pour coordonnées triangle int TRY2; // variable pour coordonnées triangle void setup() { Serial.begin(9600); // initialize and clear display display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay(); display.display(); } void loop() { for (int t = 1; t < 361; t = t+6) { // boucle pour 360°(avec un pas de 6) int signal = 2; // Signal récepteur sur pin D2 int val1 ; int val2; val1 = pulseIn(signal, HIGH), 30000; //Lire signal et de le stocker en tant que val1 val1 = map(val1, 1000, 2000, 2, 30); val1 = constrain(val1, 2, 30); if (val1 == 2 || val1 == 30) { val2 = 28; } // conversion valeurs signal radio en valeurs vitesse if (val1 == 3 || val1 == 29) { val2 = 26; } if (val1 == 4 || val1 == 28) { val2 = 24; } if (val1 == 5 || val1 == 27) { val2 = 22; } if (val1 == 6 || val1 == 26) { val2 = 20; } if (val1 == 7 || val1 == 25) { val2 = 18; } if (val1 == 8 || val1 == 24) { val2 = 16; } if (val1 == 9 || val1 == 23) { val2 = 14; } if (val1 == 10 || val1 == 22) { val2 = 12; } if (val1 == 11 || val1 == 21) { val2 = 10; } if (val1 == 12 || val1 == 20) { val2 = 8; } if (val1 == 13 || val1 == 19) { val2 = 6; } if (val1 == 14 || val1 == 18) { val2 = 4; } if (val1 == 15 || val1 == 17) { val2 = 2; } if (val1 == 16) { val2 = 0; } int TRY0 = val1 ; // variable pour coordonnées triangle int TRY1 = val1 - 2 ; // variable pour coordonnées triangle int TRY2 = val1 + 2 ; // variable pour coordonnées triangle double radt = t * (pi / 180); // calcul sin et cos pour bouger extrémitée ligne du cercle double sint = sin(radt); double cost = cos(radt); u = (int) x0 + (r*cost); v = (int) y0 + (r*sint); x1 = round(u); // arrondi à l'entier le plus proche y1 = round(v); // arrondi à l'entier le plus proche display.drawLine(0, 0, 127, 0, WHITE); // dessine les trois cadres de notre écran display.drawLine(0, 31, 127, 31, WHITE); display.drawLine(0, 0, 0, 31, WHITE); display.drawLine(127, 0, 127, 31, WHITE); display.drawLine(42, 0, 42, 31, WHITE); display.drawLine(84, 0, 84, 31, WHITE); display.drawCircle(21, 16, 12, WHITE); // dessine les cercles du radar display.drawCircle(21, 16, 8, WHITE); display.drawCircle(21, 16, 4, WHITE); display.drawLine(21, 16, x1, y1, WHITE); // dessine la ligne de balayage radar display.drawPixel(29, 9, WHITE); // dessine l'écho radar display.drawPixel(28, 10, WHITE); display.drawPixel(30, 10, WHITE); display.drawPixel(29, 11, WHITE); if (t >= 300 && t < 340) { display.drawPixel(28, 9, WHITE); // dessine l'écho radar augmenté display.drawPixel(30, 9, WHITE); display.drawPixel(28, 11, WHITE); display.drawPixel(30, 11, WHITE); display.drawPixel(27, 8, WHITE); display.drawPixel(31, 8, WHITE); display.drawPixel(27, 12, WHITE); display.drawPixel(31, 12, WHITE); } else { display.drawPixel(28, 9, BLACK); // effacement de l'écho radar augmenté display.drawPixel(30, 9, BLACK); display.drawPixel(28, 11, BLACK); display.drawPixel(30, 11, BLACK); display.drawPixel(27, 8, BLACK); display.drawPixel(31, 8, BLACK); display.drawPixel(27, 12, BLACK); display.drawPixel(31, 12, BLACK); } display.setTextColor(WHITE); // affichage variable vitesse display.setTextSize(1); display.setCursor(87,12); display.println(val2); display.setTextColor(WHITE); // affichage texte vitesse display.setTextSize(1); display.setCursor(100,2); display.println(F("AV")); display.setCursor(100,24); display.println(F("AR")); display.setCursor(100,12); display.println(F("Nd")); display.fillTriangle(118, TRY0, 114, TRY1, 114, TRY2, WHITE); // affichage 2 triangles blanc lecture vitesse avec position selon manche des gaz display.fillTriangle(122, TRY0, 126, TRY1, 126, TRY2, WHITE); display.fillRect(118, 2, 4, 28, WHITE); // affichage bargraph vitesse display.drawLine(118, 16, 122, 16, BLACK); display.drawLine(118, 16, 122, 17, BLACK); display.drawLine(114, 2, 128, 2, WHITE); display.drawLine(114, 28, 128, 30, WHITE); display.display(); display.clearDisplay(); } } |