/*
  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();
   
   }

}