Skip to main content

Contrôle de Réacteur de Synthèse de l'Acétate d'Éthyle

Projet MU5CI803 - Optimisation et contrôle des procédés.

NOM et Prénom : ALIOUT Hayem / BENAMOKRANE Faiza  Soulef / BOUZIDI Manel / DJEBBAR Meriem / FERHI Abderrahmane

Introduction : 

L'acétate d'éthyle est un liquide utilisé comme solvant pour les vernis à ongles et certaines colles, en raison de sa faible nocivité et de sa volatilité importante, il est aussi utilisé dans l'industrie agroalimentaire dans certains arômes fruités.

https://www.labolycee.org/synthese-de-lacetate-dethyle

La synthèse de l'acétate d'éthyle est une réaction d'estérification relativement simple mais hautement efficace. Elle implique la réaction entre l'éthanol (alcool) et l'acide éthanoïque (acide acétique), conduisant à la formation de l'acétate d'éthyle et d'eau comme sous-produit.

CH3CH2OH + CH3COOH CH3COOCH2CH3 + H2O

Objectif du projet :

L'objectif de ce projet est de concevoir un réacteur permettant la synthèse d'acétate d'éthyle, tout en garantissant un contrôle précis de deux paramètres essentiels : la température de la réaction et le débit des réactifs.

Réactifs utilisés :

  • Éthanol (alcool)
  • Acide éthanoïque (acide acétique)
  • Catalyseur : Généralement, aucun catalyseur n'est nécessaire pour cette réaction, car l'acide éthanoïque agit comme un catalyseur intrinsèque.

Matériel Utilisé :

  • Capteur de température 
  • Détecteur de niveau (Ultrasonic Rnager) (nombre à revoir )
  • 2 électrovannes.
  • Un breadboard.
  • Une carte Arduino Uno.
  • 2 modules relais.
  • Tapis chauffant- Peltier- 
  • X fils de connexion
  • X mètre de tuyaux.
  • Alimentation.
  • Support

Appareils utilisés :

Imprimante 3D.

Outils manuels ( Pistolets à colle, pied à coulise..)

Etapes de construction : 

 

Mode opératoire (inclus dans les étapes je pense)

Codes Arduino et montage:

Détecteur de niveau : (Ultrasonic Rnager)

ultrasons ranger est un module de mesure de distance sans contact qui fonctionne à 40 KHz. Lorsque nous fournissons un signal de déclenchement d'impulsion de plus de 10 µS via la broche de signal, le Grove_Ultrasonic_Ranger émettra 8 cycles de niveau de cycle de 40 kHz et détectera l'écho. La largeur d'impulsion du signal d'écho est proportionnelle à la distance mesurée. Voici la formule : Distance = temps élevé du signal d'écho * Vitesse du son (340M/S)/2. Le signal de déclenchement et d'écho de Grove_Ultrasonic_Ranger partage 1 broche SIG.

 

Seeeduino

Grove-Ultrasonic Ranger

5V

Red

GND

Black

Not Conencted

White

D7

Yellow

Le code à copier dans l'arduino est le suivant :

#include "Ultrasonic.h"

Ultrasonic ultrasonic(7);
void setup()
{
 Serial.begin(9600);
}
void loop()
{
 long RangeInInches;
 long RangeInCentimeters;

 Serial.println("The distance to obstacles in front is: ");
 RangeInInches = ultrasonic.MeasureInInches();
 Serial.print(RangeInInches);//0~157 inches
 Serial.println(" inch");
 delay(250);

 RangeInCentimeters = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval
 Serial.print(RangeInCentimeters);//0~400cm
 Serial.println(" cm");
 delay(250);
}

Photo

Code électrovanne:

// Pin de contrôle du relais

const int relayPin = 6;


void setup() {

  // Initialise la broche de contrôle du relais en mode sortie

  pinMode(relayPin, OUTPUT);

  Serial.begin(9600);

}


void loop() {

  // Ouvre l'électrovanne pendant 5 secondes

  openValve();

  delay(5000);


  // Referme l'électrovanne

  closeValve();

  

  // Ne fait rien d'autre dans la boucle

}


void openValve() {

  // Active le relais pour alimenter l'électrovanne

  digitalWrite(relayPin, HIGH);

  Serial.println("Électrovanne ouverte");

}


void closeValve() {

  // Désactive le relais pour couper l'alimentation de l'électrovanne

  digitalWrite(relayPin, LOW);

  Serial.println("Électrovanne fermée");

}

Code Capteur de température :



// Include the libraries we need

#include <OneWire.h>

#include <DallasTemperature.h>


// Data wire is plugged into port 2 on the Arduino

#define ONE_WIRE_BUS 2


// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)

OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature.

DallasTemperature sensors(&oneWire);


// arrays to hold device address

DeviceAddress insideThermometer;


/*

 * Setup function. Here we do the basics

 */

void setup(void)

{

  // start serial port

  Serial.begin(9600);

  Serial.println("Dallas Temperature IC Control Library Demo");


  // locate devices on the bus

  Serial.print("Locating devices...");

  sensors.begin();

  Serial.print("Found ");

  Serial.print(sensors.getDeviceCount(), DEC);

  Serial.println(" devices.");


  // report parasite power requirements

  Serial.print("Parasite power is: ");

  if (sensors.isParasitePowerMode()) Serial.println("ON");

  else Serial.println("OFF");

 

  // Assign address manually. The addresses below will beed to be changed

  // to valid device addresses on your bus. Device address can be retrieved

  // by using either oneWire.search(deviceAddress) or individually via

  // sensors.getAddress(deviceAddress, index)

  // Note that you will need to use your specific address here

  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };


  // Method 1:

  // Search for devices on the bus and assign based on an index. Ideally,

  // you would do this to initially discover addresses on the bus and then

  // use those addresses and manually assign them (see above) once you know

  // the devices on your bus (and assuming they don't change).

  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

 

  // method 2: search()

  // search() looks for the next device. Returns 1 if a new address has been

  // returned. A zero might mean that the bus is shorted, there are no devices,

  // or you have already retrieved all of them. It might be a good idea to

  // check the CRC to make sure you didn't get garbage. The order is

  // deterministic. You will always get the same devices in the same order

  //

  // Must be called before search()

  //oneWire.reset_search();

  // assigns the first address found to insideThermometer

  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");


  // show the addresses we found on the bus

  Serial.print("Device 0 Address: ");

  printAddress(insideThermometer);

  Serial.println();


  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)

  sensors.setResolution(insideThermometer, 9);

 

  Serial.print("Device 0 Resolution: ");

  Serial.print(sensors.getResolution(insideThermometer), DEC);

  Serial.println();

}


// function to print the temperature for a device

void printTemperature(DeviceAddress deviceAddress)

{

  // method 1 - slower

  //Serial.print("Temp C: ");

  //Serial.print(sensors.getTempC(deviceAddress));

  //Serial.print(" Temp F: ");

  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit


  // method 2 - faster

  float tempC = sensors.getTempC(deviceAddress);

  if(tempC == DEVICE_DISCONNECTED_C)

  {

    Serial.println("Error: Could not read temperature data");

    return;

  }

  Serial.print("Temp C: ");

  Serial.print(tempC);

  Serial.print(" Temp F: ");

  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit

}

/*

 * Main function. It will request the tempC from the sensors and display on Serial.

 */

void loop(void)

{

  // call sensors.requestTemperatures() to issue a global temperature

  // request to all devices on the bus

  Serial.print("Requesting temperatures...");

  sensors.requestTemperatures(); // Send the command to get temperatures

  Serial.println("DONE");

 

  // It responds almost immediately. Let's print out the data

  printTemperature(insideThermometer); // Use a simple function to print out the data

}


// function to print a device address

void printAddress(DeviceAddress deviceAddress)

{

  for (uint8_t i = 0; i < 8; i++)

  {

    if (deviceAddress[i] < 16) Serial.print("0");

    Serial.print(deviceAddress[i], HEX);

  }

}


AVEC LED : 

#include <OneWire.h>

#include <DallasTemperature.h>


// Broche de contrôle du relais

const int relayPin = 7;


// Broche du bouton

const int buttonPin = 2;


// Broches de contrôle des LEDs

const int yellowLedPin = 8;  // Broche pour la LED jaune

const int redLedPin = 9;     // Broche pour la LED rouge


// Broche pour le capteur de température

#define ONE_WIRE_BUS 2


// Initialisation d'une instance OneWire pour communiquer avec des dispositifs OneWire

OneWire oneWire(ONE_WIRE_BUS);


// Initialisation d'une instance DallasTemperature en utilisant la référence oneWire

DallasTemperature sensors(&oneWire);


// Tableau pour stocker l'adresse du thermomètre

DeviceAddress insideThermometer;


void setup() {

  // Initialise les broches

  pinMode(relayPin, OUTPUT);

  pinMode(buttonPin, INPUT_PULLUP);

  pinMode(yellowLedPin, OUTPUT);

  pinMode(redLedPin, OUTPUT);


  // Initialise la communication série

  Serial.begin(9600);


  // Recherche des dispositifs sur le bus

  sensors.begin();

  sensors.getAddress(insideThermometer, 0);


  // Configure la résolution du capteur de température

  sensors.setResolution(insideThermometer, 9);

}


void loop() {

  // Vérifie si le bouton est enfoncé

  if (digitalRead(buttonPin) == LOW) {

    // Si le bouton est enfoncé, active l'électrovanne et mesure la température

    activateValve();

    measureTemperature();

  } else {

    // Sinon, désactive l'électrovanne et éteint les LEDs

    deactivateValve();

    digitalWrite(yellowLedPin, LOW);

    digitalWrite(redLedPin, LOW);

  }

}


void activateValve() {

  // Active le relais pour alimenter l'électrovanne

  digitalWrite(relayPin, HIGH);

  Serial.println("Électrovanne activée");

}


void deactivateValve() {

  // Désactive le relais pour couper l'alimentation de l'électrovanne

  digitalWrite(relayPin, LOW);

  Serial.println("Électrovanne désactivée");

}


void measureTemperature() {

  // Envoie une commande pour obtenir les températures depuis les capteurs

  sensors.requestTemperatures();

  

  // Obtient la température en degrés Celsius

  float tempC = sensors.getTempC(insideThermometer);


  // Allume la LED jaune si la température est inférieure à 60 degrés Celsius

  if (tempC < 60) {

    digitalWrite(yellowLedPin, HIGH);

    digitalWrite(redLedPin, LOW);

  } 

  // Allume la LED rouge si la température est supérieure à 90 degrés Celsius

  else if (tempC > 90) {

    digitalWrite(yellowLedPin, LOW);

    digitalWrite(redLedPin, HIGH);

  } 

  // Éteint toutes les LEDs si la température est entre 60 et 90 degrés Celsius

  else {

    digitalWrite(yellowLedPin, LOW);

    digitalWrite(redLedPin, LOW);

  }


  // Affiche la température

  Serial.print("Température en Celsius : ");

  Serial.println(tempC);

  

  // Attente pour éviter une lecture trop rapide

  delay(1000);

 

}

 

Journal de bord 

13 Novembre 2023 :

Choix du thème de projet et sa validation par Monsieur Pulpytel.

03 Décembre 2023 : 

Début d'assemblage du support ainsi que la modélisation du réacteur et