ajout de l'archi et de la BDD

master
Antoine PEREDERII 2 years ago
parent 910e5aef96
commit 977d14f5a2

@ -0,0 +1,141 @@
/*************************************************
* Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}
void loop() {
// no need to repeat the melody.
}

@ -0,0 +1,39 @@
#include "TFT_eSPI.h"
TFT_eSPI tft;
float f=10.0/3;
String chaine="et oui !";
void setup() {
tft.begin();
tft.setRotation(1); // Définis le coin de l'écran de coordonnées 0,0
tft.fillScreen(TFT_RED); // fond rouge
tft.drawPixel(150,10, TFT_WHITE); // Dessine un pixel blanc aux coordonnées X=150, Y=10
tft.drawLine(5, 5, 25, 20,TFT_BLACK); // Dessine une ligne noire des coordonnées (5,5) aux coordonnées (25,20)
tft.drawFastHLine(3, 25, 150, TFT_BLUE); //Dessine une ligne Horizontale bleue de 150 pixels de long depuis les coordonnées (3,25)
tft.drawFastVLine(3, 25, 150, TFT_GREEN); // ici elle est verte et Verticale
tft.drawRect(7,27,25,50,TFT_YELLOW);
tft.fillRect(7,150,25,50,TFT_YELLOW);
tft.drawCircle(50,50,9,TFT_CYAN);
tft.fillCircle(50, 70, 9, TFT_CYAN);
tft.drawEllipse(100,50,10,20,TFT_NAVY);
tft.fillEllipse(100, 100,20,10, TFT_NAVY);
tft.fillTriangle(100,150, 100,170, 130,170, TFT_DARKGREEN);
tft.fillRoundRect(170,25,70,50,9,TFT_PURPLE);
tft.drawChar(280,30,'A',TFT_BLACK,TFT_WHITE,4);
tft.setTextColor(TFT_BLACK);
tft.setTextSize(2);
tft.drawNumber(12,170, 160);
tft.drawFloat(f,4,230,160); /* 4 chiffres apres virgule) */
tft.drawString("Salut", 170, 180);
tft.setTextSize(1);
tft.drawString("Des exemples de dessins, de couleurs",70, 200);
tft.setCursor(70,220); //positionne le curseur aux coordonnées X=70 t Y=220
tft.print(chaine); // Écrit la chaine à partir du curseur courant et déplace le curseur d'autant
}
void loop() {
}

@ -0,0 +1,58 @@
#include "Arduino.h"
class Ultrasonic
{
public:
Ultrasonic(int pin);
void DistanceMeasure(void);
double microsecondsToCentimeters(void);
double microsecondsToInches(void);
private:
int this_pin;//pin number of Arduino that is connected with SIG pin of Ultrasonic Ranger.
long duration;// the Pulse time received;
};
Ultrasonic::Ultrasonic(int pin)
{
this_pin = pin;
}
/*Begin the detection and get the pulse back signal*/
void Ultrasonic::DistanceMeasure(void)
{
pinMode(this_pin, OUTPUT);
digitalWrite(this_pin, LOW);
delayMicroseconds(2);
digitalWrite(this_pin, HIGH);
delayMicroseconds(5);
digitalWrite(this_pin,LOW);
pinMode(this_pin,INPUT);
duration = pulseIn(this_pin,HIGH);
}
/*The measured distance from the range 0 to 400 Centimeters*/
double Ultrasonic::microsecondsToCentimeters(void)
{
return duration/29.0/2.0;
}
/*The measured distance from the range 0 to 157 Inches*/
double Ultrasonic::microsecondsToInches(void)
{
return duration/74.0/2.0;
}
Ultrasonic ultrasonic(2);
void setup()
{
Serial.begin(9600);
}
void loop()
{
double RangeInInches;
double RangeInCentimeters;
ultrasonic.DistanceMeasure();// get the current signal time;
RangeInInches = ultrasonic.microsecondsToInches();//convert the time to inches;
RangeInCentimeters = ultrasonic.microsecondsToCentimeters();//convert the time to centimeters
Serial.println("The distance to obstacles in front is: ");
Serial.print(RangeInInches);//0~157 inches
Serial.println(" inch");
Serial.print(RangeInCentimeters);//0~400cm
Serial.println(" cm");
delay(1000);
}

@ -0,0 +1,68 @@
// /* Commentaires et bugs à olivier.guinaldo@uca.fr
// Dépt Informatique - IUT Clermont - Avril 2022 */
// #include "TFT_eSPI.h"
// #define R 5 //Rayon de la boule donc diamètre 10
// #define XMAX 320
// #define YMAX 240
// TFT_eSPI tft;
// int x=XMAX/2,y=YMAX/2 ; //boule positionnée au milieu de l'écran
// unsigned int modif=1 ; //si déplacement, on affiche. 1 pour premier affichage
// void setup() {
// tft.begin();
// tft.setRotation(3); // (0,0) à l'oppossé du joyssitck
// tft.fillScreen(TFT_WHITE); // fond blanc
// pinMode(WIO_5S_UP, INPUT_PULLUP);
// pinMode(WIO_5S_DOWN, INPUT_PULLUP);
// pinMode(WIO_5S_LEFT, INPUT_PULLUP);
// pinMode(WIO_5S_RIGHT, INPUT_PULLUP);
// }
// void loop() {
// if (digitalRead(WIO_5S_UP) == LOW) {
// modif=1;
// y--;
// if (y < 0) {
// tft.fillScreen(TFT_WHITE);
// y=YMAX ;
// }
// }
// else if (digitalRead(WIO_5S_DOWN) == LOW) {
// modif=1;
// y++;
// if (y >= YMAX) {
// tft.fillScreen(TFT_WHITE);
// y=0 ;
// }
// }
// else if (digitalRead(WIO_5S_LEFT) == LOW) {
// modif=1;
// x--;
// if (x<0) {
// tft.fillScreen(TFT_WHITE);
// x=XMAX ;
// }
// }
// else if (digitalRead(WIO_5S_RIGHT) == LOW) {
// modif=1;
// x++;
// if (x >= XMAX) {
// tft.fillScreen(TFT_WHITE);
// x=0;
// }
// }
// if (modif == 1){
// // remettre un fond blanc prend du temps (320x240 pixels à changer) l'affichage n'est plus fluide
// // donc on efface le précédent avec un cercle blanc plus grand
// tft.fillCircle(x,y,R + 1,TFT_WHITE);
// // on affiche le nouveau cercle
// tft.fillCircle(x,y, R, TFT_RED);
// modif=0;
// }
// //le delay permet de régler la vitesse de déplacement
// delay(20);
// }

@ -0,0 +1,197 @@
-- 1. Écrire une fonction nb_femmes_v1 (sans utiliser de curseur) qui retourne le nombre dathlètes féminines concourant pour le pays dont le nom est passé en paramètre.
CREATE OR REPLACE FUNCTION nb_femmes_v1(nom_pays pays.nom%TYPE)
RETURNS INT AS $$
BEGIN
return (
SELECT COUNT(*)
FROM athlete a, pays p
WHERE p.nom = nom_pays AND p.code = a.pays AND a.sexe = 'F'
);
END;
$$ LANGUAGE plpgsql;
-- 2. Même question, mais la fonction nb_femmes_v2 devra utiliser un curseur.
CREATE OR REPLACE FUNCTION nb_femmes_v2(nom_pays pays.nom%TYPE)
RETURNS INT AS $$
DECLARE
curs cursor FOR SELECT a.pays, a.paysNaiss
FROM athlete a, pays p
WHERE p.nom = nom_pays AND p.code = a.pays AND sexe = 'F';
rec athlete.code%TYPE;
n INT := 0;
BEGIN
open curs;
fetch curs into rec;
while found loop
n = n + 1;
fetch curs into rec;
end loop;
close curs;
return n;
END;
$$ LANGUAGE plpgsql;
-- 3. Vérifier que vos deux fonctions retournent bien le même résultat. Vous pouvez par exemple tester avec la France.
SELECT nb_femmes_v1('France'), nb_femmes_v2('France');
-- nb_femmes_v1 | nb_femmes_v2
-- --------------+--------------
-- 172 | 172
-- (1 ligne)
-- 4. Modifier les deux fonctions précédentes pour ne compter que les athlètes féminines qui concourent pour un pays différent de leur pays de naissance.
CREATE OR REPLACE FUNCTION nb_femmes_v1(nom_pays pays.nom%TYPE)
RETURNS INT AS $$
BEGIN
return (
SELECT COUNT(*)
FROM athlete a, pays p
WHERE p.nom = nom_pays AND p.code = a.pays AND a.sexe = 'F' AND a.pays != a.paysNaiss
);
END;
$$ LANGUAGE plpgsql;
-- nbFemme2
CREATE OR REPLACE FUNCTION nb_femmes_v2(nom_pays pays.nom%TYPE)
RETURNS INT AS $$
DECLARE
curs cursor FOR SELECT a.pays, a.paysNaiss
FROM athlete a, pays p
WHERE p.nom = nom_pays AND p.code = a.pays AND sexe = 'F';
pays athlete.pays%TYPE;
paysNaiss athlete.paysNaiss%TYPE;
n INT := 0;
BEGIN
open curs;
fetch curs into pays, paysNaiss;
while found loop
if pays != paysNaiss then
n = n + 1;
end if;
fetch curs into pays, paysNaiss;
end loop;
close curs;
return n;
END;
$$ LANGUAGE plpgsql;
-- 5. Vérifier que vos deux fonctions retournent bien le même résultat.
SELECT nb_femmes_v1('France'), nb_femmes_v2('France');
-- nb_femmes_v1 | nb_femmes_v2
-- --------------+--------------
-- 11 | 11
-- (1 ligne)
-- 6. Ecrire un bloc PL/pgSQL anonyme permettant de mettre à jour le pays de naissance des athlètes pour lequel linformation nest pas connue, en indiquant comme pays celui pour lequel ils concourent. Afficher un message à chaque modification.
DO $$
DECLARE
curs cursor FOR SELECT pays
FROM athlete
WHERE paysNaiss IS NULL
FOR UPDATE;
athlete_pays athlete.pays%TYPE;
BEGIN
open curs;
fetch curs into athlete_pays;
while found loop
UPDATE athlete SET paysNaiss = athlete_pays WHERE CURRENT OF curs;
raise notice 'update';
fetch curs into athlete_pays;
end loop;
close curs;
END;
$$ LANGUAGE plpgsql;
-- 7. Pour pouvoir gérer laffectation des chambres dans le village olympique, lorganisation a besoin de connaître les dates de présence de chaque athlète. Créer une table Present(#athlete, dateArrivee, dateDepart).
DROP TABLE IF EXISTS present;
CREATE TABLE IF NOT EXISTS present (
athlete CHAR(6) PRIMARY KEY REFERENCES athlete(code),
dateArrivee DATE NOT NULL,
dateDepart DATE NOT NULL
);
-- 8. Ecrire un bloc PL/pgSQL anonyme permettant de remplir la table Present
INSERT INTO present
SELECT
a.code,
(MIN(e.dateE) - 14) dateArrivee,
LEAST(
'2021-08-11',
MAX(e.dateE) + 1 + (
CASE WHEN COUNT(r.medaille) >= 3 THEN 5
WHEN COUNT(r.medaille) >= 1 THEN 3
ELSE 0
END
)
) dateDepart
FROM athlete a, pratiquer p, epreuve e, resultat r
WHERE p.athlete = a.code AND e.discipl = p.discipl AND r.athlete = a.code
GROUP BY a.code;
-- INSERT 0 11644
-- 9. Ecrire une fonction nbAth_jour qui prend en paramètre le nom dun pays, un sexe et une date et retourne le nombre dathlètes du pays et du sexe donnés présents au village olympique à la date donnée.
CREATE OR REPLACE FUNCTION nbAth_jour(nom_pays pays.nom%TYPE, sexe_athlete athlete.sexe%TYPE, date_presence DATE)
RETURNS INT AS $$
BEGIN
return (
SELECT COUNT(*) FROM present p, athlete a
WHERE a.code = p.athlete AND a.pays = (SELECT code FROM pays WHERE nom = nom_pays)
AND sexe = sexe_athlete
AND date_presence BETWEEN dateArrivee AND dateDepart
);
END;
$$ LANGUAGE plpgsql;
-- 10. Utiliser la fonction nbAth_jour pour savoir combien de chambres sont nécessaires pour la délégation française le 6 août 2021, sachant que les athlètes sont deux par chambre et quil ny a pas de chambre mixte.
SELECT CEIL(nbAth_jour('France', 'F', '2021-08-06')::FLOAT / 2) + CEIL(nbAth_jour('France', 'M', '2021-08-06')::FLOAT / 2);
-- ?column?
-- ----------
-- 129 ou 56 ???
-- (1 ligne)
-- 11. Un virus circule. Ecrire une fonction confiner qui prend un paramètre (une date) et qui permet de repousser dune semaine, si besoin, le départ des athlètes qui étaient présents au village olympique à la date donnée. La fonction devra retourner le nombre dathlètes impactés
DROP FUNCTION confiner;
CREATE OR REPLACE FUNCTION confiner(date_confinement DATE)
RETURNS INT AS $$
DECLARE
curs cursor FOR SELECT dateDepart
FROM present
WHERE date_confinement BETWEEN dateArrivee AND dateDepart
FOR UPDATE;
date_depart present.dateDepart%TYPE;
nb INT := 0;
BEGIN
open curs;
fetch curs into date_depart;
while found loop
-- UPDATE present SET dateDepart = GREATEST(date_confinement + 7, dateDepart) WHERE CURRENT OF curs;
if (date_confinement + 7) > date_depart then
UPDATE present SET dateDepart = (date_confinement + 7) WHERE CURRENT OF curs;
nb = nb + 1;
end if;
fetch curs into date_depart;
end loop;
close curs;
return nb;
END;
$$ LANGUAGE plpgsql;
SELECT confiner('2021-07-27');
-- confiner
-- ----------
-- 2869
-- (1 ligne)
-- 12. Executer le script jo.sql pour annuler les modifications réalisées pendant ce tp.
\i jo.sql
Loading…
Cancel
Save