4. Arduino and Microcontroller#

4. Arduino and Microcontroller#

I’ve choosen the micro controller option

DHT20 - Temperature & RH sensor#

The first exercice was to build a humidity detector using the DHT20 sensor. We took the code inspiration from the DHT code samples.

Me and all the other student of he class had some trouble to make our code work and connect the raspberry pi to our computer. With some trials and error some of us finally succeed to make our raspberry pi accepts the code, by changing the SDA and SCL ports.



//
//    FILE: DHT20_plotter.ino
//  AUTHOR: Rob Tillaart
// PURPOSE: Demo for DHT20 I2C humidity & temperature sensor
//
//  Always check datasheet - front view
//
//          +--------------+
//  VDD ----| 1            |
//  SDA ----| 2    DHT20   |
//  GND ----| 3            |
//  SCL ----| 4            |
//          +--------------+


#include "DHT20.h"

DHT20 DHT(&Wire);


void setup()
{
 // DHT.begin();
  Wire.setSDA(20);

  Wire.setSCL(21);
  Wire.begin();
  Serial.begin(115200);
  Serial.println("Humidity, Temperature");
}


void loop()
{
  if (millis() - DHT.lastRead() >= 1000)
  {
    //  note no error checking
    DHT.read();
    Serial.print(DHT.getHumidity(), 1);
    Serial.print(", ");
    Serial.println(DHT.getTemperature(), 1);
  }
}


NeoPixel - Addressable RGB LED#

The second exercie was to control the LED on the board.

I started from the sample code from the NeoPixel library and i’ve choosen to do a loop on the rgb values so the color are changing throughout the time.

Alt Text

Second Day#

Servo Motor#

As I finished the two exercices on the first day, i’ve choosen on the second day to use the mini servo motor that i’ve succeed to change the turning sens.

Alt Text

Distance indicator#

The second exercie i’ve choosen was to make a distance detector. On this one i’ve also had some trouble to make my code work as the code was not written for this specific device, I had to find where changing the SDA and SLA values.

Alt Text

#include <Wire.h>
#include <VL6180X.h>

VL6180X sensor;

void setup()
{
  Serial.begin(9600);
  //Wire.begin();
Wire.setSDA(20);
 Wire.setSCL(21);
  sensor.init();
  sensor.configureDefault();


  // Reduce range max convergence time and ALS integration
  // time to 30 ms and 50 ms, respectively, to allow 10 Hz
  // operation (as suggested by table "Interleaved mode
  // limits (10 Hz operation)" in the datasheet).
  sensor.writeReg(VL6180X::SYSRANGE__MAX_CONVERGENCE_TIME, 30);
  sensor.writeReg16Bit(VL6180X::SYSALS__INTEGRATION_PERIOD, 50);

  sensor.setTimeout(500);

   // stop continuous mode if already active
  sensor.stopContinuous();
  // in case stopContinuous() triggered a single-shot
  // measurement, wait for it to complete
  delay(300);
  // start interleaved continuous mode with period of 100 ms
  sensor.startInterleavedContinuous(100);

}

void loop()
{
  Serial.print("Ambient: ");
  Serial.print(sensor.readAmbientContinuous());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.print("\tRange: ");
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}

Flickering LED 2nd#

Après avoir barboté dans ces expérimentation avec les arduinos du fablab, je me suis dit que j’avais envie de encore plus de lumières chatoyantes, scintillantes, clignotantes et au changement chromatique. Mon petit kit arduino, qui prenait la poussière dans un coin sombre de mon tiroir depuis une éternité, a finalement trouvé son heure de gloire.

💡 Guidé par les lambeaux de mes connaissances électriques de bachelier - avec des bribes floues des lois des nœuds et des mailles, j’ai réussi à brancher ce petit circuit rudimentaire coonstitué de fil, de résistances et de LED :

Key points à retenir : - le courant passe du plus vers le moins - une led a besoin d’une résistance, et le courant ne la traverse que dans un sens (unidirectionel) - plus y’a du courant, plus la led est illuminée

Pour l’instant ce circuit n’est qu’un switch, un arduino et 4 LED, (3 led simples à deux pins et une led RGB à 4 pins). Aucune ne danse en changeant de couleur, ni même ne daigne s’allumer. Face à ce tableau, j’ai donc décidé de dégainer mon arme secrète : la programmation (pas si secrète que ça, c’est quand même mes études).


// Author = EVA DUBAR
// goal = led on, led flicker and colorchanging led
// cc-by-sa
int switchState = 0;
long randNumber;

long prevr = 10;
long prevg = 20;
long prevb = 30;
long newr, newg, newb;
int step = 0;


void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));

  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(2, INPUT);
}

void loop()
{
  switchState = digitalRead(2); // check if the switch button is currently pressed or not
  if (switchState == LOW){
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    analogWrite(9, 0);
    analogWrite(10, 0);
    analogWrite(11, 0);

  }
  else{
    for(int i = 0; i<2400; i++){  ///loop during +-1min, the time the led's stays on

    switchState = digitalRead(2);
    digitalWrite(3, HIGH);   //led nr 3 is always on
    for(int j = 0; j<2; j++){  
      randNumber = random(250);
      analogWrite(4+j, randNumber); //led nr 4 and 5 receive a random intensity between 0 and 255
     /* if(randNumber<150){
        digitalWrite(4+j, LOW);
      }
      else digitalWrite(4+j, HIGH);*/
    }
//slowly change color f(t) = (1-t)*A + t*B   

    if(i%100==0){ //rgb led is changing color every 2.5 sec and interpolate between the futur and previous 
                  //color, so the color change is continuous
      step = 0;
      prevr = newr;
      prevb = newb;
      prevg = newg;
      newr = random(255);
      newb = random(255);
      newg = random(255);

    }
    else{

      long a = prevr * (100-step);
      long b = prevb * (100-step);
      long c = prevg * (100-step);
      analogWrite(9,  (a + step*newr)/100);
      analogWrite(10, (b + step*newb)/100);
      analogWrite(11, (c + step*newg)/100);
      step++;
    }

    delay(25); //delay 25sec, loop 2400 times, led stays on +-1min
  }
  }


  delay(50);

}

(À ma grande surprise, j’ai réalisé que j’avais commenté mon code en anglais, comme je l’avais annoncé dans ma présentation - c’est la déformation de faire ses études en anglais)

Pour démystifier ce qui est expliqué dans mon code, la partie loop du code est composée en 2 parties, le premier ‘if’ teste si le boutton est pressé ou pas, et la deuxieme partie (le plus intéréssante, du coup) change 2400 fois, à interval de 25 ms, les intensités des différentes led. Pour les led clignotantes, chaque intensité est décidé par un chiffre aléatoire et pour la led rgb, une valeur par couleur est décidée toutes les 2.4 secondes et la valeur sur la led est une interpolation linéaire entre cette valeur décidée et la valeur de max 2.4 secondes au par avant, par cette formule : $f(t)=(1-t)A+tB$

Et voilà! avec ça on se retrouve à un circuit tout illuminé et scintillant, qui fait mal aux yeux si regardé trop longtemps (mais tant mieux pour vous, lecteur.ice, qui êtes plus safe derrière votre écran). Plus qu’à admirer: