Je suis un étudiant terminal sti2d , nous avons un projet à moi et mon groupe ma tâche et réglons la température dans un terrarium avec une lampe chauffante le matin de 11 ° à 20 ° et le soir de 23 ° à 30 °.
J'ai un capteur ds18b20
Un arduino
écran LCD
Un relais
J'ai besoin d'aide pour avoir un programme sur ce projet je n'arrive pas au début, je voudrais que tu m'aides merci.
Le plus simple pour commencer, c'est de se renseigner : l'une des meilleurs sources est le tuto d'Eskimon, lis le, prépare un début de programme et reviens s'il ne fonctionne pas comme prévu...
Bonsoir , je suis desolé je suis pas habituer a poster de sujet . Bah exactement j'ai rien je n'arrive pas a faire de programme arduino on ne m'a jamais appris, tous les gens de ma classe on trouvé leur programme déja fait sur internet et moi non (mon prof est nul ). Je dois trouver un programme arduino qui permet de reguler la température le jour et la nuit (pas tres facil pour un debutant )
Bonjour,
Comme l'a signalé lesept, on apprends pas à courir avant de savoir marcher...
Commence par quelques tutos simples pour apprendre à maîtriser les bases de l'arduino.
Pas de tracas pour le temps que ça prends, c'est rapide.
Ensuite pour ton projet il te manque un élément essentiel... un module RTC
Et comme le dit Infobarquee, si tu veux de l'aide, il faut un programme à corriger, personne ici ne fera un programme pour toi, sinon tu ne comprendras quand même rien au monde de l'arduino.
Saches juste qu'un DS18B20, avec un relais et un RTC, il n'y a rien de trop complexe.
#include <OneWire.h> // Inclusion de la librairie OneWire
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
#define RELAY 2
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(850); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(57600);
Wire.begin();
RTC.begin();
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, HIGH);
Serial.begin(57600); // Initialisation du port série
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));}}
// loop()
void loop() {
DateTime now = RTC.now();
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
J'ai que sa .J'aimerais savoir mtn comment reguler la température du matin(8hà20h) entre 11° et 20° et le soir (20hà8h) entre 20 °et 30° dans le programme grace a une lampe chauffante
Pour ton DS18B20, utilise en plus de oneWire la librairie DallasTemperature, ça va te simplifier le programme et elle va faire beaucoup de choses pour toi !
Ton sketch en état va juste te donner l'heure et la température.
Dans ton loop tu dois ajouter des conditions
Du genre : "si il est entre x heures et x heures et que la température est inférieure à x degrés, allume le relais"
C'est un début, mais il faut apprendre par différents tutos comment utiliser le DS1307 et comment mettre une condition de temps et une condition de température
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
if( temp <= 11 && now.hour() >= 8 && now.hour() <= 20 && now.day() >= 1 && && now.day() <= 7 ){ // si on est entre 8h et 20h que la T° < 11°
digitalWrite(RELAY,HIGH);
;
}
else if( temp >= 20 ){ // si T° dépasse 20° on coupe le relais
digitalWrite(RELAY,LOW);
delay(10000);
}
else digitalWrite(RELAY,LOW); // sinon, les conditions ne sont pas réunis, on coupe le relais
} } }
if( temp <= 20 && now.hour() >= 20 && now.hour() <= 8 && now.day() >= 1 && && now.day() <= 7 ){ // si on est entre 20 et 8h que la T° < 17°
digitalWrite(RELAY,HIGH);
;
}
else if( temp >= 30 ){ // si T° dépasse 30° on coupe le relais
digitalWrite(RELAY,LOW);
delay(10000);
}
else digitalWrite(RELAY,LOW); // sinon, les conditions ne sont pas réunis, on coupe le relais
} } }
nous avons un projet à moi et mon groupe ma tâche et réglons la température dans un terrarium
Comme sa ?
Je sais que sur ce forum il est interdit de critiquer le style et l'orthographe mais c'est un forum où on parle le français. Pour un candidat au bac c'est atterrant.
Dis toi bien qu'un correcteur qui a plus de 200 copies à corriger ne passera pas plus d'une minute sur des copies où il est obligé de déchiffrer du début à la fin.
A sa place ce serait clair pour moi : 0,5 points par page écrite pour l'encre dépensée.
Est-ce que tu pourrai avoir la politesse de te relire avant de poster !
Si tu ne l'a pas encore vu il y a un bouton "PREVIEW" qui aide bien.
#include <OneWire.h> // Inclusion de la librairie OneWire
#include <DallasTemperature.h> //Librairie du capteur
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur
boolean getTemperature(float *temp){
byte data[9], addr[8];
// data : Données lues depuis le scratchpad
// addr : adresse du module 1-Wire détecté
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(1000); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
// Calcul de la température en degré Celsius
*temp = ((data[1] << 8) | data[0]) * 0.0625;
// Pas d'erreur
return true;
}
// setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
}
// loop()
void loop() {
float temp;
// Lit la température ambiante à ~1Hz
if(getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
}
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
if( temp <= 11 && now.hour() >= 8 && now.hour() <= 20 && { // si on est entre 8h et 20h que la T° < 11°
digitalWrite(RELAY,HIGH);
;
}
else if( temp >= 20 ){ // si T° dépasse 20° on coupe le relais
digitalWrite(RELAY,LOW);
delay(10000);
}
else digitalWrite(RELAY,LOW); // sinon, les conditions ne sont pas réunis, on coupe le relais
} } }
if( temp <= 20 && now.hour() >= 20 && now.hour() <=8 { // si on est entre 20 et 8h que la T° < 17°
digitalWrite(RELAY,HIGH);
;
}
else if( temp >= 30 ){ // si T° dépasse 30° on coupe le relais
digitalWrite(RELAY,LOW);
delay(10000);
}
else digitalWrite(RELAY,LOW); // sinon, les conditions ne sont pas réunis, on coupe le relais
} } }
Comme ça?(vraiment mon premier programme arduino )
Bon... tu te complique la vie...
Utilise les exemples des différentes librairies, ça peut déjà t'éclairer beaucoup
Par exemple, pour ton DS18B20 (partie de code que j'utilise pour un des aquariums) :
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress fish = { 0x28, 0xEE, 0xFA, 0xC3, 0x1D, 0x16, 0x01, 0xCC }; // cherche le code oneWire finder pour avoir l'adresse de ton capteur
void setup() {
sensors.begin();
sensors.setResolution(fish, 12); // de 9 à 12, plus la valeur est grande, plus de temps il faudra au capteur pour mesurer la température.
}
void loop() {
sensors.requestTemperatures();
Serial.print(sensors.getTempC(fish));
}
Pour le reste, la programmation c'est beaucoup de logique
if(now.hour() >= 8 && now.hour() <= 20){ // définition de la plage horaire
if(sensors.getTempC(capteur) < 11){ // définition de la température minimum
digitalWrite(RELAY, HIGH);
}
if(sensors.getTempC(capteur) >= 20){ // définition de la température maximum
digitalWrite(RELAY, LOW);
}
}
Bon, là tu as quasi tout le code, à toi de faire le nécessaire maintenant, et d'adapter selon tes besoins.
Compile ton code pour voir si tout est correct avant de poster aussi, les indications de l'IDE sont importantes.
Quel agacement ?
C'est écrit direct dans son premier message !
De plus juste avant il avait posté dans le message d'un autre avec un sujet sans relation.
Il y a un moment ou il faut rapeller les règles élémentaires de politesse.
Il n'est pas sur un forum d'ados ou tout est permis.
Ce n'est pas une critique c'est une constatation.
Attends un peu et tu va voir tous ceux qui vont appeller au secours à partir du 15 avril parce que leur prof , nul bien évidement car eux sont très forts, leur aura rappellé que la remise du projet c'est dans un mois et qu'ils n'ont encore rien fait.
Je reconnais que lui au moins fait quelque chose, même si on en attend plus d'un candidat au bac.
//declare global parameters as needed----------
#include<Wire.h> //to handle DS1307 using I2C Bus; I have problem with RTClib.h Library
#include <DallasTemperature.h> //to handle DS18B20 sensor
#include<LiquidCrystal_I2C.h> //to handle I2CLCD
LiquidCrystal_I2C lcd(0x27, 16, 2); //wiring function for I2CLCD
unsigned int dsTemp; //to hold integer value for the Temperature given by DS18B20
#define ONE_WIRE_BUS 10 //DPin-10 is the signal wire for DS18B20 with 2.2k pull-up
OneWire oneWire(ONE_WIRE_BUS); //DS18B20 is an 1-Wire device
DallasTemperature sensors(&oneWire); //we are using dallas library
void setup()
{
Serial.begin(9600); //Initialize Serial Monitor at 9600 Bd
Wire.begin(); //Intialize I2C Bus
//------------------------------------------------------------------
lcd.init(); //initialize I2CLCD
lcd.backlight();
//------------------------------------------------------------------
pinMode(12, OUTPUT); //relay control is DPin-12
//------------------------------------------------------------------
setIntialTimeInRTC(); //set initial time in 24 hrs format
}
void loop()
{
showTimeOnLCD(); //acquire Time and show on Top Line of LCD
showTempOnLCD(); //acquire temperature and show on Bottom line of LCD
makeDecisionMorning(); //8am - 8pm ---> 08:00:00 -- 20:00:00
makeDecisionEvening(); //8pm - 8am ---> 20:00:00 -- 08:00:00
}
void setIntialTimeInRTC() //set initial time manually at: (say) 23 : 58 : 36
{
Wire.beginTransmission(0x68); //START, Roll Cal
Wire.write(0x00); //set SEC Register address
Wire.write(0x36); //set SEC Register value (BCD)
Wire.write(0x58); //set MIN Register value
Wire.write(0x23); //set HRS Register value
Wire.endTransmission(); //Execute the above queued data, ACK, STOP
}
void showTimeOnLCD()
{
Wire.beginTransmission(0x68); //START, Roll Cal
Wire.write(0x00); //set SEC Register address
Wire.endTransmission(); //Execute the above queued data, ACK, STOP
Wire.requestFrom(0x68, 3); //SEC, MIN, and HRS to read from RTC as BCD
byte bcdSeconds = Wire.read();
byte bcdMinutes = Wire.read();
byte bcdHours = Wire.read();
//bcdHours = bcdHours & 0b00111111;
lcd.setCursor(0, 0);
lcd.print("Time = ");
//show HRS--
lcd.write((bcdHours>>4) + 0x30);
lcd.write((bcdHours & 0x0F) + 0x30);
lcd.write(':');
//show MIN--
lcd.write((bcdMinutes>>4) + 0x30);
lcd.write((bcdMinutes & 0x0F) + 0x30);
lcd.print(':');
//show SEC
lcd.write((bcdSeconds>>4) + 0x30);
lcd.write((bcdSeconds & 0x0F) + 0x30);
}
void showTempOnLCD()
{
sensors.requestTemperatures(); // Temp conversion command; waiting here until comversion is done
dsTemp = sensors.getTempCByIndex(0); //read temp data from Sensor #0 and convert to celsius float
lcd.setCursor(0, 1);
lcd.print("Temp = ");
lcd.print(dsTemp);
lcd.write(0xDF);
lcd.print('C');
// delay(500); //sample temperature at 2-sec interval
}
void makeDecisionMorning() //8am - 8pm Heater ON when Temp is >=10 C and <=30 C
{
dsTemp = sensors.getTempCByIndex(0);
if(dsTemp >=10)
{
if(dsTemp <= 30)
{
digitalWrite(11, HIGH); //Heater ON
return;
}
}
digitalWrite(12, LOW); //Heater OFF
}
void makeDecisionEvening()
{
dsTemp = sensors.getTempCByIndex(0);
lcd.setCursor(14, 1);
lcd.print(dsTemp);
if(dsTemp >=20)
{
if(dsTemp <= 30)
{
digitalWrite(12, HIGH);
return;
}
}
digitalWrite(12, LOW);
}
Mon nouveau programme j'aimerais savoir si il marche s'il vous plait .