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