Go Down

Topic: Faire fonctionner des programmes simultanément (Read 85 times) previous topic - next topic

DebutantArduino

Apr 23, 2019, 09:25 am Last Edit: Apr 23, 2019, 11:55 am by DebutantArduino
Bonjour, j'ai un RTC et un capteur de température (DS18B20) à faire fonctionner dans un programme pour afficher sur un afficheur LED 24 matrices de 5*7 LEDS.
Mon problème est que je dois faire afficher la température, et l'heure SI aucun message n'est tapé.
Or, dans le programme final si aucun message n'est tapé rien n'est affiché.
J'ai donc tenté de faire fonctionner les deux séparément du programme final, mais il ne marche pas ensemble.
Donc comment puis-je les faires fonctionner ensemble ??
L'ensemble, est connecte sur un Arduino sur un shield fabriqué main
Au passage, mon RTC affiche une heure de moins qu'avant ? Comment lui mettre la bonne heure ?

Programme RTC :
Code: [Select]
// BTS SN2 Adrien DECOURCELLE 2018-2019
// Lgt Philippe De Girard

// Fonction de Date et heure en utilisant
// le RTC DS1307 RTC via bus I2C et librairie Wire

#include <Wire.h>
#include "RTClib.h"

// Utiliser la classe RTC_DS1307 ou RTC_PCF8523 en
// fonction du module RTC utilisé
RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC n est pas en cours de fonctionnement!");
   
    // La ligne suivante fixe la date et l'heure du RTC avec les dates et heures de compilation du sketch
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}

void loop () {
    DateTime now = RTC.now();
   
    // Jour
    Serial.print(now.day(), DEC);
    Serial.print('/');
    // Mois
    Serial.print(now.month(), DEC);
    Serial.print('/');
    // Année
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    // Heure
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    // Minute
    Serial.print(now.minute(), DEC);
    Serial.print(':');
     // Seconde
    Serial.print(now.second(), DEC);
    Serial.println();
    // Rapidité de message en ms (3000 ms = 3 s par exemple)
    Serial.println();
    delay(1000);
}


Programme Capteur DS18B20 :

Code: [Select]
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
// 2018-2019 D.A
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
#include <OneWire.h>

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
#define BAUDRATE 57600

boolean started = false;

void setup(void) {
  Serial.begin(BAUDRATE);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;

  // Chercher l'adresse du capteur
  if ( !ds.search(addr)) {
    Serial.println();
    ds.reset_search();
    delay(1000);
    return;
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC non valide!");
      return;
  }
  Serial.println();
 
  // Indication du type de capteur
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }
 
  if (started == false)
   { present = ds.reset();
     ds.select(addr);
     ds.write(0x4E);
     ds.write(0x4B);
     ds.write(0x46);
     ds.write(0x6f);
     started = true;
   }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();
 
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");

}


Et en pièce-jointe le "gros programme"

lesept

Bonjour débutant
Tu as bon pour le format du message mais pas pour son emplacement : ici c'est le bar, les questions sont à poster dans le forum principal. Utilise le bouton 'report to moderator' pour demander à le faire déplacer.
Merci
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

DebutantArduino

Très bien, merci et désolé alors ! C'est que mes précédentes demandes ont été déplacés ici alors je comprends pas trop. x)

Go Up