Jona LaD's bento : Différence entre versions

 
Ligne 77 : Ligne 77 :
 
|Notes=<translate>Vous trouverez dans les fichiers le lien du site pour obtenir le modèle 3D du NekiNeko. Vous y trouverez également le lien de mon profil Tinkercad où figurent le modèle 3D de mon 3ème étage et de l'hélice utilisée.
 
|Notes=<translate>Vous trouverez dans les fichiers le lien du site pour obtenir le modèle 3D du NekiNeko. Vous y trouverez également le lien de mon profil Tinkercad où figurent le modèle 3D de mon 3ème étage et de l'hélice utilisée.
  
Voici maintenant le code permettant de faire fonctionner l'ensemble de la partie électronique du bento (les modules  FastLED, BME280I2C, Wire , SSD1306, Stepper et AccelStepper doivent bien entendu êtres installés) :</translate>
+
Voici maintenant le code permettant de faire fonctionner l'ensemble de la partie électronique du bento (les modules  FastLED, BME280I2C, Wire , SSD1306, Stepper et AccelStepper doivent bien entendu êtres installés) :
 +
 
 +
// librairie fastled
 +
 
 +
<nowiki>#</nowiki>include "FastLED.h"
 +
 
 +
//ici le nombre total de leds
 +
 
 +
<nowiki>#</nowiki>define NUM_LEDS 12
 +
 
 +
// ici la pin pour les leds
 +
 
 +
<nowiki>#</nowiki>define DATA_PIN 6
 +
 
 +
// déclaration d'un tableau pour les leds
 +
 
 +
CRGB leds[NUM_LEDS];
 +
 
 +
// librairies pour le BME
 +
 
 +
<nowiki>#</nowiki>include <BME280I2C.h>
 +
 
 +
<nowiki>#</nowiki>include <Wire.h>
 +
 
 +
<nowiki>#</nowiki>include "ssd1306.h"
 +
 
 +
BME280I2C::Settings settings(
 +
 
 +
BME280::OSR_X1,
 +
 
 +
BME280::OSR_X1,
 +
 
 +
BME280::OSR_X1,
 +
 
 +
BME280::Mode_Forced,
 +
 
 +
BME280::StandbyTime_1000ms,
 +
 
 +
BME280::Filter_Off,
 +
 
 +
BME280::SpiEnable_False,
 +
 
 +
0x77 // I2C address. I2C specific.
 +
 
 +
);
 +
 
 +
BME280I2C bme(settings);
 +
 
 +
/* Ces tableaux de caractères serviront UNIQUEMENT pour l'affichage à l'écran.
 +
 
 +
<nowiki>*</nowiki>  Il faudra afficher ces variables et non les "floats" déclarées pour le capteur,
 +
 
 +
<nowiki>*</nowiki>  l'écran ne reconnaissant que des chaînes de caractère
 +
 
 +
<nowiki>*</nowiki>/
 +
 
 +
char tempC[9];
 +
 
 +
char humC[10];
 +
 
 +
char presC[11];
 +
 
 +
/* Example sketch to control a 28BYJ-48 stepper motor with ULN2003 driver board and Arduino UNO. More info: <nowiki>https://www.makerguides.com</nowiki> */
 +
 
 +
// Include the Arduino Stepper.h library:
 +
 
 +
<nowiki>#</nowiki>include <Stepper.h>
 +
 
 +
<nowiki>#</nowiki>include <AccelStepper.h>
 +
 
 +
// Define number of steps per rotation:
 +
 
 +
const int stepsPerRevolution = 2048;
 +
 
 +
// Wiring:
 +
 
 +
// Pin 8 to IN1 on the ULN2003 driver
 +
 
 +
// Pin 9 to IN2 on the ULN2003 driver
 +
 
 +
// Pin 10 to IN3 on the ULN2003 driver
 +
 
 +
// Pin 11 to IN4 on the ULN2003 driver
 +
 
 +
// Create stepper object called 'myStepper', note the pin order:
 +
 
 +
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);
 +
 
 +
int led = 5; // on déclare que la LED est branchée sur la pin 9
 +
 
 +
int sensorValue; // on déclare une variable pour notre capteur
 +
 
 +
void setup() {
 +
 
 +
// Set the speed to 5 rpm:
 +
 
 +
myStepper.setSpeed(5);
 +
 
 +
 
 +
// Begin Serial communication at a baud rate of 9600:
 +
 
 +
pinMode (led,OUTPUT); // on déclare la led en tant que sortie
 +
 
 +
Serial.begin (9600); // on lance la communication avec l'ordinateur
 +
 
 +
// put your setup code here, to run once:
 +
 
 +
// on lance l'écran et on le colore de noir
 +
 
 +
ssd1306_128x64_i2c_init();
 +
 
 +
ssd1306_fillScreen(0x00);
 +
 
 +
// on lance la typo
 +
 
 +
ssd1306_setFixedFont(ssd1306xled_font6x8);
 +
 
 +
 
 +
// tout ce blabla sert uniquement à vérifier si un capteur est présent et bien branché
 +
 
 +
while(!Serial) {} // Wait
 +
 
 +
Wire.begin();
 +
 
 +
while(!bme.begin())
 +
 
 +
{
 +
 
 +
Serial.println("Could not find BME280 sensor!");
 +
 
 +
delay(1000);
 +
 
 +
}
 +
 
 +
// bme.chipID(); // Deprecated. See chipModel().
 +
 
 +
switch(bme.chipModel())
 +
 
 +
{
 +
 
 +
case BME280::ChipModel_BME280:
 +
 
 +
Serial.println("Found BME280 sensor! Success.");
 +
 
 +
break;
 +
 
 +
case BME280::ChipModel_BMP280:
 +
 
 +
Serial.println("Found BMP280 sensor! No Humidity available.");
 +
 
 +
break;
 +
 
 +
default:
 +
 
 +
Serial.println("Found UNKNOWN sensor! Error!");
 +
 
 +
}
 +
 
 +
 
 +
 
 +
// on démarre les leds avec le bon modèle
 +
 
 +
FastLED.addLeds<WS2811, DATA_PIN, GRB>(leds, NUM_LEDS);
 +
 
 +
// on peut régler ici la luminosité : 0-255
 +
 
 +
LEDS.setBrightness(25);
 +
 
 +
 
 +
delay(1000);
 +
 
 +
}
 +
 
 +
void loop() {
 +
 
 +
 
 +
int  sensorValue = analogRead (A0); // on déclare que la variable sensorValue correspond à la lecture de valeurs sur le port A0
 +
 
 +
int sensorValue1 = map (sensorValue, 0, 1023, 0, 15)+1;
 +
 
 +
int sensorValue2 = map (sensorValue, 0, 1023, 0, 255)+1;
 +
 
 +
Serial.print("V1=");
 +
 
 +
Serial.print(sensorValue1);
 +
 
 +
Serial.print("V2=");
 +
 
 +
Serial.print(sensorValue2);
 +
 
 +
analogWrite (led, sensorValue2); // on inscrit cette valeur sur la led
 +
 
 +
myStepper.setSpeed(sensorValue1);
 +
 
 +
// Step one revolution in one direction:
 +
 
 +
Serial.println("clockwise");
 +
 
 +
myStepper.step(stepsPerRevolution);
 +
 
 +
delay(50);
 +
 
 +
//  stepper.runSpeed();
 +
 
 +
 
 +
// Step one revolution in the other direction:
 +
 
 +
Serial.println("counterclockwise");
 +
 
 +
//myStepper.step(-stepsPerRevolution);
 +
 
 +
//delay(500);
 +
 
 +
// put your main code here, to run repeatedly:
 +
 
 +
 
 +
 
 +
// On déclare 3 variables : température, humidité, pression
 +
 
 +
float temp(NAN), hum(NAN), pres(NAN);
 +
 
 +
// Déclenchement du capteur
 +
 
 +
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
 +
 
 +
BME280::PresUnit presUnit(BME280::PresUnit_hPa);
 +
 
 +
bme.read(pres, temp, hum, tempUnit, presUnit);
 +
 
 +
//pres = pres/100;
 +
 
 +
// ces lignes servent à convertir les valeurs "float" du capteur en "char" destinées à l'écran
 +
 
 +
// (utile uniquement pour votre code final)
 +
 
 +
dtostrf (temp,5,1,tempC);
 +
 
 +
dtostrf (hum,5,0,humC);
 +
 
 +
dtostrf (pres,5,0,presC);
 +
 
 +
// on imprime les valeurs sur le moniteur série
 +
 
 +
Serial.print("Temp: ");
 +
 
 +
Serial.print(temp , 1);
 +
 
 +
Serial.print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
 +
 
 +
Serial.print("\t\tHumidity: ");
 +
 
 +
Serial.print(hum , 0);
 +
 
 +
Serial.print("% RH");
 +
 
 +
Serial.print("\t\tPressure: ");
 +
 
 +
Serial.print(pres , 0);
 +
 
 +
Serial.println("hPa");
 +
 
 +
 
 +
ssd1306_printFixed (0,  16, "Temperature :" , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (75,  16, tempC , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (110,  16, "°C" , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (0,  32, "Humidite :" , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (55,  32, humC , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (100,  32, "% RH" , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (0,  48, "Pression :" , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (55,  48, presC , STYLE_NORMAL);
 +
 
 +
ssd1306_printFixed (100,  48, "hPa" , STYLE_NORMAL);
 +
 
 +
//delay(500);
 +
 
 +
// tout allumer
 +
 
 +
/* for( int i = 0; i < 4; i++){
 +
 
 +
leds[i] = CRGB::Yellow;
 +
 
 +
}
 +
 
 +
for( int i = 4; i < 8; i++){
 +
 
 +
leds[i] = CRGB::Orange;
 +
 
 +
}
 +
 
 +
for( int i = 8; i < 12; i++){
 +
 
 +
leds[i] = CRGB::Purple;
 +
 
 +
}*/
 +
 
 +
/*for ( int i = 0 ; i<=5 ; i++){
 +
 
 +
leds[2*i] = CRGB::Green;
 +
 
 +
leds[2*i+1] = CRGB::Red;
 +
 
 +
}
 +
 
 +
FastLED.show();
 +
 
 +
delay(1000);
 +
 
 +
for ( int i = 0 ; i<=5 ; i++){
 +
 
 +
leds[2*i] = CRGB::Red;
 +
 
 +
leds[2*i+1] = CRGB::Green;
 +
 
 +
}
 +
 
 +
FastLED.show();
 +
 
 +
delay(1000);
 +
 
 +
// FastLED.show();*/
 +
 
 +
if (hum>50 && temp<30) {
 +
 
 +
for(int i = 0 ; i<=11 ; i++){
 +
 
 +
leds[i] = CRGB::Blue;
 +
 
 +
}
 +
 
 +
}
 +
 
 +
else if (hum>50 && temp>=30){
 +
 
 +
for(int i = 0 ; i<=11 ; i++){
 +
 
 +
leds[i] = CRGB::Red;
 +
 
 +
}
 +
 
 +
}
 +
 
 +
else {
 +
 
 +
for (int i = 0 ; i<=11 ; i++){
 +
 
 +
int r = random(256);
 +
 
 +
int g = random(256);
 +
 
 +
int b = random(256);
 +
 
 +
delay(100);
 +
 
 +
leds[i] = CRGB(r , g , b);
 +
 
 +
FastLED.show();
 +
 
 +
}
 +
 
 +
}
 +
 
 +
FastLED.show();
 +
 
 +
}
 +
 
 +
<br /></translate>
 
}}
 
}}
 
{{PageLang
 
{{PageLang

Version actuelle datée du 16 juin 2022 à 16:08

Auteur avatarJonas Marc Hugo Balandraux | Dernière modification 16/06/2022 par Jonas

Jona LaD s bento Bento90.jpg
Dans le cadre de la formation hybride de l'IMT Mines Albi voici la description détaillée du 3ème étage de la Bentolux - Jona LaD's Bento.
Difficulté
Facile
Durée
4 jour(s)
Catégories
Art, Décoration, Électronique, Mobilier, Bien-être & Santé
Coût
30 EUR (€)

Introduction

Ce projet s'insère dans le cadre de la formation hybride d'IMT Mines Albi de septembre 2021 à mars 2022 (MOOC + ateliers en présentiel). L'objectif de cette formation est de créer une station météo personnalisée. L'objet de page est la description du 3ème étage. Pour moi ce bento devait être décoratif. Aussi le mot bento désigne à l'origine une boîte Japonaise permettant de stocker et déplacer la nourriture (équivalent du tupperware). Alors j'ai décidé de prendre le thème de la culture Japonaise : on peut voir apparaitre Totoro, un sushi, un Nékinéko, le Mont Fuji, les caractères en japonais (amour), une silhouette de temple rappellant le Japon et l'hélice est une référence au film d'animation japonais Le Château ambulant réalisé Hayao Miyazaki (le trou au sommet est un espace pour placer un petit pot de fleur bonsaï). Au delà de l'aspect station météo de l'objet, les autres composants électroniques sont dédié uniquement à la décoration et l'animation du bento.

Étape 1 - Découpe des faces latérales :

La face du dessus repose sur les 4 faces latérales.

Leurs dimensions sont :

2 faces 8x12cm (faces devant et derrière)

l'une des deux doit être trouée en sont centre d'un disque de rayon 6mm pour laisser passer l'axe du moteur.

Les 2 face latérales sont de dimension 8x11.4cm.

Les faces ont été découpées à la découpeuse à jet d'eau sur un support de 3mm d'épaisseur.

Étape 2 - Impression 3D de la face supérieure

La face supérieure est constituée d'un pavé 3mmx12cmx12cm sur laquelle j'ai placé un Nékinéko (modèle importé en pièce jointe) et d'un cône troué créé dans le but d'y placer un pot de fleur ou autre plante.

Filaments utilisés : ultimaker grey ABS et ultimaker natural PVA

Niveau de détail : 0,2 mm et

Remplissage : 20%




Étape 3 - Impression 3D hélice

L'hélice doit se placer sur l'arbre moteur. On adapte donc les dimension de l'arbre de 6mm de diamètre. On fait donc un trou de 7mm de diamètre au centre de l'hélice (1mm de marge).

Filaments utilisés : ultimaker grey ABS et ultimaker natural PVA

Niveau de détail : 0,06 mm et

Remplissage : 40%




Étape 4 - Stickers

Pour décorer la face supérieure, on utilise plusieurs stickers. Il est facile de les imprimer, il suffit d'une image en noir et blanc (il faut que le niveau de détail soit assez faible) pour pouvoir créer son sticker. Voici ci-contre les images utilisées pour mes différents stickers.


Étape 5 - Codage

Le codage du 3ème étage doit permettre de lier le potentiomètre à la luminosité de la LED et la vitesse de rotation du moteur. Pour cela les bibliothèques à importer sont : FastLED, BME280I2C, Wire, SSD1306, Stepper et AccelStepper.

Le code n'est pas très compliqué mais utilise plusieurs fonctions jamais vues auparavant.

Vous pourrez trouver ci-contre les images du code et le code écrit en "Notes et références".

Notes et références

Commentaires

Draft