sprekende vuilnisbak

algemene C code
Berichten: 12
Geregistreerd: 15 Dec 2016, 19:45

sprekende vuilnisbak

Berichtdoor hans50-dec » 10 Mei 2017, 01:22

Beste forumleden,
Mijn nieuwste project behelst een sprekende vuilnisbak en werkt met een PIR-sensor en een afstandssensor (HCSR04). Verder is op de Arduino een MP3 spelerkaart geprikt met SD kaart lezer.
Zodra er beweging wordt opgemerkt begint een melodie te spelen. Komt de persoon binnen een range van 60-100cm dan moet melodie 2 beginnen en melodie 1 stoppen uiteraard. Tevens wanneer de persoon binnen 60cm van de vuilnisbak komt, dan begint melodie 3 en stopt de andere weer.
Kunnen jullie je licht eens laten schijnen over de sketch???? Hieronder de code en het schema. Dank daarvoor.

Code: Alles selecteren
/*
  This project triggers an MP3 when a short-range ultra-sonic
  sensor is triggered and movement is detected.
  Copyrights 2017 Hans Schuurmans
*/
#include <SPI.h>

#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>

SdFat sd;
SFEMP3Shield MP3player;

int PIR = 0;
int PIRpin = A0; // pir pin
int TRIG_PIN = A1; // trigger pin
int ECHO_PIN = A3; // echo pin

void setup()
{
  uint8_t result; //result code from some function as to be tested at later time.

  Serial.begin(115200);
  delay(3000);
  pinMode(PIRpin, INPUT); // pir pin
  pinMode(TRIG_PIN, OUTPUT); // trigger pin
  pinMode(ECHO_PIN, INPUT); // echo pin

  //start the shield
  //Initialize the SdCard.
  if (!sd.begin(SD_SEL, SPI_HALF_SPEED)); // sd.initErrorHalt();
  if (!sd.chdir("/")); // sd.errorHalt("sd.chdir");
  //  sd.begin(SD_SEL, SPI_HALF_SPEED);

  //  MP3player.begin();
  //Initialize the MP3 Player Shield
  result = MP3player.begin();
  //check result, see readme for error codes.
  if (result != 0)
  {
    Serial.print(F("Error code: "));
    Serial.print(result);
    Serial.println(F(" when trying to start MP3 player"));
    if ( result == 6 )
    {
      Serial.println(F("Warning: patch file not found, skipping.")); // can be removed for space, if needed.
      Serial.println(F("Use the \"d\" command to verify SdCard can be read")); // can be removed for space, if needed.
    }
  }
  MP3player.setBitRate(192);
  MP3player.setVolume(10, 10);
  MP3player.setMonoMode(1);
}// end setup

void loop()
{
  long duration, distance;
  long avgDistance = 0;
  /*
    Currently receiving an invalid reading every fourth attempt.
    This loop averages out the readings to compensate for this.
  */
  for (int i = 0; i < 4; i++)
  {
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(1000);
    digitalWrite(TRIG_PIN, LOW);
    duration = pulseIn(ECHO_PIN, HIGH);

    //Convert to centimeters
    distance = (duration / 2) / 29;
    avgDistance += distance;
    delay(50);
  }
  avgDistance = (avgDistance / 4);

  PIR = digitalRead(PIRpin);

  Serial.print("PIR= ");
  Serial.println(PIR);
  Serial.print(avgDistance );
  Serial.println(" cm");

  if ((PIR == 1) && (avgDistance > 100))
  {
    // Track 4 is being played below.
    MP3player.stopTrack();
    MP3player.playTrack(4);
    Serial.print(avgDistance );
    Serial.println(" cm");
    Serial.println("track 4 muziek");
  }

  else if ((PIR == 1) && (avgDistance <= 100 && avgDistance > 60) && MP3player.isPlaying())
  {
    MP3player.stopTrack();
    MP3player.playTrack(3);// gracias met applaus
    Serial.print(avgDistance );
    Serial.println(" cm");
    Serial.println("track 3 gracias met applaus");
    delay(2000);
    return;
  }

  else if ((PIR == 1) && (avgDistance <= 60 && avgDistance > 20) && MP3player.isPlaying())
  {
    MP3player.stopTrack();
    MP3player.playTrack(2);//gracias
    Serial.print(avgDistance );
    Serial.println(" cm");
    Serial.println("track 2 gracias");
    delay(2000);
    return;
  }
}//end void loop
Bijlagen
Avfalbak.jpg
Avfalbak.jpg (81.67 KiB) 172 keer bekeken

Advertisement

Gebruikers-avatar
Berichten: 1188
Geregistreerd: 06 Aug 2016, 01:03

Re: sprekende vuilnisbak

Berichtdoor Koepel » 14 Mei 2017, 10:45

hans50-dec schreef:Kunnen jullie je licht eens laten schijnen over de sketch????

Wat voor licht ?
In plaats van licht heb ik een paar kleine brokjes om op te knabbelen.

De PIR sensor heeft een pulldown weerstand van 10k. Ik ken wel PIR sensor met een open-collector uitgang, waar een pullup weerstand nodig is. Maar een pulldown heb ik nog niet gezien.

Een pin nummer mag een 'const' zijn.

Probeer niet om iets "slim" op te schrijven. Schrijf de code helder en duidelijk.
Code: Alles selecteren
  // Dit is goed, normaal if-statement
  if (!sd.begin(SD_SEL, SPI_HALF_SPEED))
    sd.initErrorHalt();

  // Dit is goed, normale code
  sd.begin(SD_SEL, SPI_HALF_SPEED);


De variabele 'PIR' is een integer en daarin komt het resultaat van 'digitalRead'. Dat kan alleen maar HIGH of LOW zijn. Je vergelijkt het met '1', maar het is beter om het met 'HIGH' te vergelijken.

Er zitten twee 'delay(2000)' in. In die tijd kan een PIR sensor aktief worden. Tijdens die delay kun je niets doen. Het is me niet duidelijk waar die delay voor is.

Er zitten twee 'return' in de loop(). Dat lijkt me nergens voor nodig. Dat is blijkbaar gekopieerd van iets anders.

Hoe vaak naar de sensoren wordt gekeken, dat hangt van de code af. Je bepaalt dus niet zelf hoe vaak dat is. Dat geeft niet, maar het zou handig zijn als een indicatie had hoe vaak per seconde de loop() wordt uitgevoerd.

Blijkbaar is de code niet goed, en wordt de Ultrasonic sensor vier keer uitgevoerd. Dat lijkt me niet correct. Misschien kun je het werkend krijgen en gewoon één keer dat doen. Wiskundig gezien klopt het niet om een verkeerde meting weg te werken door het gemiddelde te nemen. Er is een New Ping library: https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten