noNoseOnTV part 3

Voici le dernier code source de l’appareil NoNoseOnTV.

Et voici le schéma :


Sensor_bb

// # Author  : Hugues Lepesant
// # Date    : 30/04/2014
// # Version : 0.3
 
// # URM Code based on Jiang's work from DFRobot
// # Product name:ultrasonic scanner Kit
// # Product SKU:SEN0001
  
// # Description:
// # The Sketch for scanning 180 degree area 4-500cm detecting range
  
// # Connection:
// #       Pin 1 VCC (URM V3.2) -> VCC (Arduino)
// #       Pin 2 GND (URM V3.2) -> GND (Arduino)
// #       Pin 4 PWM (URM V3.2) -> Pin 6 (Arduino)
// #       Pin 6 COMP/TRIG (URM V3.2) -> Pin 5 (Arduino)
// # Pin mode: PWM
// # Working Mode: PWM passive control mode.
// # If it is your first time to use it,please make sure the two jumpers to the right hand
// # side of the device are set to TTL mode. You'll also find a secondary jumper on
// # the left hand side, you must break this connection or you may damage your device.


#include <IRremote.h>
#include <NewTone.h>


const int URPWM = 6;      // PWM Output 0-25000us,every 50us represent 1cm
const int URTRIG = 5;     // PWM trigger pin

const int greenLedPin = 2;
const int yellowLedPin = 4;
const int redLedPin = 7;
const int buzzerPin = 8;
 
const int distMinimum = 100; // 1 meter
const int distMedium  = 150; // 1 meter and half

const int duration = 800;
int alert = 0;
int tvPower = 1;
 
//boolean up=true;       // create a boolean variable
//unsigned long time;    // create a time variable
//unsigned long urmTimer = 0; // timer for managing the sensor reading flash rate
unsigned int Distance=0;

IRsend irsend;
 
uint8_t EnPwmCmd[4]={0x44,0x22,0xbb,0x01}; // distance measure command
  
void setup() {             // Serial initialization
    Serial.begin(9600);    // Sets the baud rate to 9600
 
    pinMode(greenLedPin, OUTPUT);
    digitalWrite(greenLedPin, LOW);
     
    pinMode(yellowLedPin, OUTPUT);
    digitalWrite(yellowLedPin, LOW);
     
    pinMode(redLedPin, OUTPUT);
    digitalWrite(redLedPin, LOW);
 
    PWM_Mode_Setup();
}
  
void loop() {
  Distance = PWM_Mode();

  
  Serial.print("Distance = ");
  Serial.print(Distance);
  Serial.println(" cm");
   
  if ( Distance > distMedium ) {
    digitalWrite(greenLedPin, HIGH);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(redLedPin, LOW);
    
    if ( tvPower == 0 ) {
      SendPowerCode(tvPower);
      tvPower = 1;
    }
    
    alert = 0;
  }
 
  if ( Distance > distMinimum && Distance < distMedium ) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(yellowLedPin, HIGH);
    digitalWrite(redLedPin, LOW);
  }
 
  if ( Distance < distMinimum ) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(yellowLedPin, LOW);
    digitalWrite(redLedPin, HIGH);
    
    alert++;

    NewTone(buzzerPin, 440, duration);


    if (alert > 2) {
      if ( tvPower == 1 ) {
        SendPowerCode(tvPower);
      }
      tvPower = 0;
    }
 }

  delay(1000);
  
  Serial.print("ALERT = ");
  Serial.println(alert);
}
 
  
void PWM_Mode_Setup(){
    pinMode(URTRIG,OUTPUT);       // A low pull on pin COMP/TRIG
    digitalWrite(URTRIG,HIGH);    // Set to HIGH
  
    pinMode(URPWM, INPUT);        // Sending Enable PWM mode command
     
    for (int i=0;i<4;i++) {
        Serial.write(EnPwmCmd[i]);
    }
}
  
int PWM_Mode(){                   // a low pull on pin COMP/TRIG  triggering a sensor reading
    digitalWrite(URTRIG, LOW);
    digitalWrite(URTRIG, HIGH);   // reading Pin PWM will output pulses
      
    unsigned long DistanceMeasured=pulseIn(URPWM,LOW);
      
    if (DistanceMeasured==50000) { // the reading is invalid.
      return 0;
    } else {
        return DistanceMeasured/50; // every 50us low level stands for 1cm
    }
}

void SendPowerCode(int tvPower)
{
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(100);
  }
  
  if ( tvPower == 1 ) {
    Serial.print("Signal Off sent");
  } else {
    Serial.print("Signal On sent");
  }
}

Ce contenu a été publié dans Mes Projets. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.