wiki:SujetTP7-2016

Version 3 (modified by franck, 8 years ago) (diff)

--

Programmation Arduino

Objectif

Le but de la séance est d'éctire un programme arduino avec plusieurs tâches, et utilisant plusieurs périphériques. Vous allez lire la valeur de la lumière sur une échelle de 1 à 100 sur un arduino et de l'afficher sur l'écran de l'autre arduino. Il y a donc au moins 2 noeuds, un émetteur et un récepteur. Pour être plus simple tous les noeuds seront identiques.

Nous allons utiliser un écran OLED connecté en I2C, 128x32 ssd1306

Utilisation de l'écran

  • La bibliothèque de l'écran se trouve en tapant la requête ssd1306 arduino
    Vous exécutez la procédure précédemment décrite. Vous devrez prendre également la bibliothèque GFX qui est la bibliothèque graphique. Cette bibliothèque fonctionne pour plusieurs types modèles. Vous allez choisir le bon exemple : 128x32 I2C.

En outre, vous allez devoir faire une petite modification dans le code.

La ligne au début de setup() display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
doit être remplacée par : display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Il s'agit de l'adresse de l'écran sur le bus I2C.

  • Vous allez utiliser l'écran pour afficher la valeur de la photorésistance après une mise à l'échelle entre 0 et 100.

Communication entre Capteurs et Base dans les deux sens

On souhaite réaliser un micro-réseaux avec deux capteurs de lumières et une base qui affiche la valeur des deux capteurs sur l'écran OLED. Mais on veut aussi que la base affiche périodiquement sur chaque capteur la valeur d'un compteur qui s'incrémente.

Correction

Affichage de la lumière sur l'écran OLED

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// unsigned int waitFor(timer, period) 
// Timer pour taches périodique
// arguments :
//  - timer  : numéro de timer entre 0 et MAX_WAIT_FOR_TIMER-1
//  - period : période souhaitée
// retour :
//  - nombre de période écoulée depuis le dernier appel
//
#define MAX_WAIT_FOR_TIMER 16
unsigned int waitFor(int timer, unsigned long period){
  static unsigned long waitForTimer[MAX_WAIT_FOR_TIMER];
  unsigned long newTime = micros() / period;
  int delta = newTime - waitForTimer[timer];
  if ( delta < 0 ) delta += 1 + (0xFFFFFFFF / period);   
  if ( delta ) waitForTimer[timer] = newTime;
  return delta;
}

// Configuration des broches
#define PIN_LUMI 1
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

// Variables globales pour la communication inter-taches
byte lumi, lumiFull;

void Lumi (int timer, unsigned long period, byte pin, byte *lumi, byte *lumiFull)
{
   if (!waitFor(timer,period)) return;
   *lumi = map(analogRead(pin),0,1023,0,99);
   *lumiFull = 1;   
}

void Oled1 (byte *mess,  byte *full) {
  if (! (*full) ) return;
  *full = 0;
  Serial.println(*mess);
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("Lumiere : ");
  display.println(*mess);
  display.display();
}

void setup() {
  Serial.begin(115200);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
}

void loop() {
  Lumi (0,1000000, PIN_LUMI, &lumi, &lumiFull);  
  Oled1 (&lumi, &lumiFull);
}