Listener voor klap sensor?

Arduino specifieke Software
Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 00:36

Hi all,

Ik ben betrekkelijk nieuw met Arduino. De laatste weken is het me gelukt om een breed scala aan sensoren (tegelijkertijd) op m'n Arduino Uno Ethernet aan te sluiten:
    18B20 temperatuur sensor
    HC-SR04 sonar sensor
    JQC-3FF relay
    laser module en RGB led
    blauw u8g SPI LCD module
    DS1307 clock

Wanneer de loop draait komt er ongeveer iedere seconde output op m'n serial port en ook m'n display wordt ongeveer iedere seconde geupdate. Het blijkt dat het hierdoor niet mogelijk is om een klap sensor te gebruiken om de relay om te zetten.

Twee vragen:
1 - Klopt het dat dit komt omdat de Arduino te druk is met de rest in de loop en het bijna toeval zou zijn als ik net m'n 'DigitalRead' aanroep terwijl ik klap?
2 - Is het mogelijk om een 'listener' toe te voegen die altijd naar de input poort met m'n klap sensor te maken die er dan tussendoor komt wanneer ik klap?

Ik ben erg benieuwd naar jullie ideeen!

Mvg,

MarkyMark
Laatst gewijzigd door MarkyMark op 12 Dec 2012, 01:18, in totaal 1 keer gewijzigd.

Advertisement

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Listener voor klap sensor?

Berichtdoor pjh » 12 Dec 2012, 00:44

Ik begrijp niet een 'klap sensor' is, maar de rest van je verhaal klinkt plausibel.

Misschien kun je de "klapsensor" op een interrupt zetten. Dan haal je hem uit de loop, en heb je geen last van andere delays en dergelijke.
een interrupt is eigenlijk een listener.
Zodra de toestand van een interruptpin (pin 2 en 3) verandert, kun je een apart stukje code laten uitvoeren. De loop wordt hiervoor automatisch onderbroken.

Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Re: Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 01:12

Thanks voor je snelle reactie! Mijn klap sensor: http://dx.com/p/arduino-microphone-soun ... red-135533

Heb je toevallig een werkend stukje voorbeeldcode van een interrruptpin?

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Listener voor klap sensor?

Berichtdoor pjh » 12 Dec 2012, 08:16

Het lijkt erop, dat je op zoek naar brood, de weg naar de slager vraagt.

Ik zeg dat omdat:
1. de techniek met interrupts zeer bruikbaar voor je is (vlees is lekker)
2. de 'klapsensor' waar jij over schrijft een electret microfoon met versterker blijkt te zijn. (brood)

Dit is wat ik denk:
Jij bedoelt met 'klap' het engelse 'knock'. En dan praat je over het gebruikt van een geluidssensor, die boven een bepaald niveau "knock knock" o.i.d. op de seriele monitor zet. Er is meen ik ook een standaard sketch die met de Arduino IDE wordt meegeleverd, die knock heet.

Indien bovenstaande klopt, dan werkt een interrupt niet zonder meer. Want een Knock/Klap-sketch, werkt via een analoge pin, terwijl een interrupt een uitgesproken AAN-UIT fenomeen is. Digitale pinnetjes dus.

Ofwel:
Klap = geluid = analoog
Interrupt = digitaal = slager.

Hoop dat je het begrijpt. Hoop dat ik het begrijp :P .

------------MAAR GOED--------------
Jouw KlapSensor is dus een electret microfoon met versterkertje.
Ik heb van mijn kennismaking met dit spul een webpagina gevuld. Misschien heb je er iets aan.
Hier is de link: http://huinink.info/electret-microfoon/

------------Interrupt programma -----------
kom ik op terug

Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Re: Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 21:57

Briljant pjh, dank voor je hulp!

Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Re: Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 21:58

Code: Alles selecteren
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                             //
//    Filename:   AllSensor_V4.ino                                                                             //
//    Date:       2012.12.10                                                                                   //
//    Goal:       Adruino file to experiment with connecting different sensors                                 //
//    Origin:     Own programming, in some cases combined with code available from the internet (via GOOGLE),  //
//                big thanks to all these unknown contributors!                                                //
//                                                                                                             //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// Import required libraries ==================================================
#include "U8glib.h"
#include "Wire.h"
#include "RTClib.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Setup button ===============================================================
//#define BUTTON 1            // Pin to R

// Setup HC-SR04 sensor =======================================================
#define ECHOPIN 2            // Pin to receive echo pulse (wit)
#define TRIGPIN 3            // Pin to send trigger pulse (groen)

// Setup PIR ==================================================================
#define PIR 4                // Pin to PIR

// Setup 18B20 sensor =========================================================
#define ONE_WIRE_BUS 5

// Setup JQC-3FF ==============================================================
#define RELAY 1

// RGB LED ====================================================================
#define RED 10                // Setup the button inpu
#define GREEN 11              // Pin to G
#define BLUE 12               // Pin to B

// Setup laser ================================================================
#define LASER 13              // Pin to laser

// Setup micropohone ==========================================================
#define MIC 6               // Pin to mic

// Setup u8g display object ===================================================
U8GLIB_ST7920_128X64 u8g(9, 8, 7, U8G_PIN_NONE); // SPI Com: SCK = en = 9, MOSI = rw = 8, CS = di = 7

// Setup a oneWire instance to communicate with the OneWire device
OneWire oneWire(ONE_WIRE_BUS);

// Pass the oneWire reference to the 18B20 sensor
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = {0x28, 0xB2, 0x27, 0x46, 0x04, 0x00, 0x00, 0xA9};

// Screensaver ================================================================
int nSinceStart = 0;          // to keep track of cycles since start
byte regel = 0;               // to avoid burnt screen
byte kolom = 0;               // to avoid burnt screen

float CMax = 0.00;           // Maximum measured temperature
float CMin = 100.00;         // Minimum measured temperature

// DS1307 Clock ================================================================
RTC_DS1307 RTC;
String weekdays [] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
unsigned long relayAan, relayUitKort, relayUitLang;


// Setup ========================================================================================================
void setup(void) {
 
  //Setup serial cummunication
  Serial.begin(115200);
 
  //Setting the Arduino I/O ports
  //pinMode(BUTTON, INPUT);
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  pinMode(PIR, INPUT);
  pinMode(RELAY, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(LASER, OUTPUT);
  pinMode(MIC, INPUT);
   
  //Thermometer =================================================================
  sensors.begin();
  sensors.setResolution(insideThermometer, 12);  // Set the resolution to 12 bit
 
  //Clock =======================================================================
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}


// Main loop ====================================================================================================
void loop(void) {
 
  // Microphone =============================================================
  int clap = digitalRead(MIC);
  //clap = 0; // Just for debugging purposes
    if(clap == 1)
  {
    digitalWrite(LASER, HIGH);
  }
  if(clap == 0)
  {
    digitalWrite(LASER, LOW);
  }
 
  Serial.print("Microphone: ");
  Serial.println(clap);
 
  // Temperature ===========================================================
  sensors.requestTemperatures();
  float tempC = sensors.getTempC(insideThermometer);
 
  Serial.print("Temperatuur [C]: ");
  Serial.println(tempC);
 
  if(tempC > CMax)
  {
    CMax = tempC;  // for use on LCD
    Serial.print(" CMax          : ");
    Serial.println(CMax);
  }
   
  if(tempC < CMin)
  {
    CMin = tempC;  // for use on LCD
    Serial.print(" CMin          : ");
    Serial.println(CMin);
  }
 
  if(tempC >= 21.0)  // glow red
  {
    digitalWrite(RED, HIGH);
    digitalWrite(GREEN, LOW);
    digitalWrite(BLUE, LOW);
  }
  if((tempC >= 15.0) && (tempC < 21.0))  // glow blue
  {
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, HIGH);
    digitalWrite(BLUE, LOW);
  }
  if(tempC < 15.0)  // glow green
  {
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, LOW);
    digitalWrite(BLUE, HIGH);
  }

  // Sonar =================================================================
  // Start ranging
  digitalWrite(LASER,LOW);
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
 
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
 
  if (distance > 2500)
  {
    distance = 0;
  }
 
  else
  {
    Serial.print("Afstand    [cm]: ");
    Serial.println(distance);
  }
 
  if(distance > 0.0 && distance < 10.00)
  {
    digitalWrite(LASER, HIGH);
  }
 
  // Clock =================================================================
  DateTime now = RTC.now();
  unsigned long nu = now.unixtime();

  // PIR ====================================================================
  byte moved = digitalRead(PIR);
  if (moved == 1)
  {
    Serial.println("Motion detected!");
   
    relayAan = (now.unixtime());
    relayUitLang = (now.unixtime() + 30 * 60);  // relay on for 30 minutes
    relayUitKort = (now.unixtime() +  1 * 60);  // relay on for 1 minute
  }
 
  if((now.hour()) < 7)  // before 7 o'clock
  {
    if(nu <= relayUitKort)
    {
    Serial.print("Time left relay on (<7h)   [s]: ");
    Serial.println(relayUitKort - nu);
    digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }
   
    if(nu > relayUitKort)
    {
    Serial.println("Relay          : OFF");
    digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }
 
  if( ((now.hour()) >= 7) && ((now.hour()) < 22) )  // between 7 and 22 o'clock
  {
    if(nu <= relayUitLang)
    {
    Serial.print("Time left relay on (7-22u) [s]: ");
    Serial.println(relayUitLang - nu);
    digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }
   
    if(nu > relayUitLang)
    {
    Serial.println("Relay          : OFF");
    digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }
 
  if( (now.hour()) >= 22)  // after 22 o'clock
  {
    if(nu <= relayUitKort)
    {
    Serial.print("Time left relay on (>22h)  [s]: ");
    Serial.println(relayUitKort - nu);
    digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }
   
    if(nu > relayUitKort)
    {
    Serial.println("Relay          : OFF");
    digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }
 
  // LCD ====================================================================
  u8g.firstPage(); 
  do
  {
    draw(now, weekdays, regel, kolom, distance, tempC, CMin, CMax, moved);
  }
 
  while( u8g.nextPage() );
 
  // rebuild the picture after some delay
  //delay(100);

// Screensaver ================================================================
  nSinceStart ++;
  if(nSinceStart % 100 == 0)
  {
    regel ++;
    kolom ++;
    if(regel>4)
    {
      regel = 1;
    }
    if(kolom>2)
    {
      kolom = 0;
    }
  }

}


// Required Functions ===========================================================================================

// Write to LCD ===============================================================
void draw(DateTime now, String weekdays[], byte regel, byte kolom, float distance, float tempC, float CMin, float CMax, byte moved)
{
 
  //DATUM ====================================
  u8g.setFont(u8g_font_5x7);
  u8g.setPrintPos(kolom, 10+regel);
  u8g.print("=");
  u8g.print(weekdays[now.dayOfWeek()]);
  u8g.print(" ");
  u8g.print(now.day(), DEC);
  u8g.print(".");
  u8g.print(now.month(), DEC);
  u8g.print(".");
  u8g.print(now.year(), DEC);
 
  u8g.print(" ");
 
  u8g.print(now.hour(), DEC);
  u8g.print(":");
  u8g.print(now.minute(), DEC);
  u8g.print(":");
  u8g.print(now.second(), DEC);
  u8g.print("=");
 
  //AFSTAND ===================================
  u8g.setFont(u8g_font_7x14);
  u8g.setPrintPos(kolom, 30+regel);
  u8g.print("Afstand: ");
  if(distance == 0)
  {
    u8g.print("-    ");
  }
  else
  {
  u8g.print(distance);
  }
  if(moved==1)
  {
    u8g.print("  *");
  }
 
  //TEMPERATUUR ===============================
  u8g.setFont(u8g_font_7x14);
  u8g.setPrintPos(kolom, 45+regel);
  u8g.print("Temperatuur: ");
  u8g.print(tempC);
 
  u8g.setFont(u8g_font_5x7);
  u8g.setPrintPos(kolom, 57+regel);
  u8g.print(" Min: ");
  u8g.print(CMin);
  u8g.print(" - Max: ");
  u8g.print(CMax);
 
}

// Convert normal decimal numbers to binary coded decimal =====================
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal number ======================
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
Laatst gewijzigd door MarkyMark op 12 Dec 2012, 23:00, in totaal 1 keer gewijzigd.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Listener voor klap sensor?

Berichtdoor pjh » 12 Dec 2012, 22:42

Kijk eens of onderstaande werkt.
Dus of bij een KLAP de LASER aan gaat (NB heb serieel print even weg gehaald).

Heb niet de hardware om te testen. Hoop dat het werkt.
Als het werkt, dan is je KLAP toch uit de loop.

Wat ik me niet heb gerealiseerd, is dat bij een KLAP die electret microfoon OVERSTUUR gaat en dus MAXIMALE output geeft. Dat is 1024 op de ADC (analoge pin), maar gewoon ÉÉn op een digitale pin.

ERGO: De bakker slacht zijn vrouw. :mrgreen:
NB: heb pin 6 en 2 omgedraaid. Zie toelichting in de sketch

Code: Alles selecteren
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                             //
//    Filename:   AllSensor_V4.ino                                                                             //
//    Date:       2012.12.10                                                                                   //
//    Goal:       Adruino file to experiment with connecting different sensors                                 //
//    Origin:     Own programming, in some cases combined with code available from the internet (via GOOGLE),  //
//                big thanks to all these unknown contributors!                                                //
//                                                                                                             //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// Import required libraries ==================================================
#include "U8glib.h"
#include "Wire.h"
#include "RTClib.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Setup button ===============================================================
//#define BUTTON 1            // Pin to R

// Setup HC-SR04 sensor =======================================================
#define ECHOPIN 6            // Pin to receive echo pulse (wit) /////???????dIT WAS PIN 2, MAAR DIE IS NAAR DE MIC GEGAAN
#define TRIGPIN 3            // Pin to send trigger pulse (groen)

// Setup PIR ==================================================================
#define PIR 4                // Pin to PIR

// Setup 18B20 sensor =========================================================
#define ONE_WIRE_BUS 5

// Setup JQC-3FF ==============================================================
#define RELAY 1

// RGB LED ====================================================================
#define RED 10                // Setup the button inpu
#define GREEN 11              // Pin to G
#define BLUE 12               // Pin to B

// Setup laser ================================================================
volatile int LASER = 13;              // Pin to laser  /////////////??????? variabelen die in een interrupt worden gebruikt moeten 'volatile' zijn. Dus door
                                                     ///                     iedereen en elke routine te benaderen, te gebruiken

// Setup micropohone ==========================================================
#define MIC 2               // Pin to mic ////??????????????DIT WAS PIN ZES, MAAR HET MOET OP PIN 2, WANT DAAR ZIT DE HARDWARE INTERRUPT (NUMMER 0) VAN DE ATMEGA328 MICROCONTROLLER OP

// Setup u8g display object ===================================================
U8GLIB_ST7920_128X64 u8g(9, 8, 7, U8G_PIN_NONE); // SPI Com: SCK = en = 9, MOSI = rw = 8, CS = di = 7

// Setup a oneWire instance to communicate with the OneWire device
OneWire oneWire(ONE_WIRE_BUS);

// Pass the oneWire reference to the 18B20 sensor
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = {
  0x28, 0xB2, 0x27, 0x46, 0x04, 0x00, 0x00, 0xA9};

// Screensaver ================================================================
int nSinceStart = 0;          // to keep track of cycles since start
byte regel = 0;               // to avoid burnt screen
byte kolom = 0;               // to avoid burnt screen

float CMax = 0.00;           // Maximum measured temperature
float CMin = 100.00;         // Minimum measured temperature

// DS1307 Clock ================================================================
RTC_DS1307 RTC;
String weekdays [] = {
  "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
unsigned long relayAan, relayUitKort, relayUitLang;

//////////// toegevoegd ///////////////////////////////////////////////////////////////////////////////////////////////
volatile unsigned long klapTijd = millis();
volatile int LASER_status = 0;

void KLAP(){
  if ((millis() - klapTijd ) > 200){
    LASER_status = 1-LASER_status;
    klapTijd = millis();
    digitalWrite(LASER, LASER_status);
  }
}
//////////// toegevoegd ///////////////////////////////////////////////////////////////////////////////////////////////


// Setup ========================================================================================================
void setup(void) {

  //Setup serial cummunication
  Serial.begin(115200);

  /*
  hieronder wordt met de opdracht attachInterrupt de volgende zaken aan elkaar gekoppeld:
   wanneer wanneer op arduino-pin 2 een 0 naar een 1 gaat (rising), wordt de void KLAP(){...} uitgevoerd.
   De nul is van interrupt 0. Deze zit op pin 2 van de arduino. Interrupt 1 zit op pin 3.
   De Arduino MEGA heeft meer interrupts
   */
  attachInterrupt(0, KLAP, RISING);

  //Setting the Arduino I/O ports
  //pinMode(BUTTON, INPUT);
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  pinMode(PIR, INPUT);
  pinMode(RELAY, OUTPUT);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(LASER, OUTPUT);
  pinMode(MIC, INPUT);

  //Thermometer =================================================================
  sensors.begin();
  sensors.setResolution(insideThermometer, 12);  // Set the resolution to 12 bit

  //Clock =======================================================================
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning())
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

}


// Main loop ====================================================================================================
void loop(void) {

  /* onderstaande stuk is niet meer nodig, want bij een klap gaat pin 2 naar hoog / 1. Dus de interrupt treed in werking en daardoor het kleine stukje code in de void KLAP()
   / Microphone =============================================================
   int clap = digitalRead(MIC);
   clap = 0;
   if(clap == 1)
   {
   digitalWrite(LASER, HIGH);
   }
   if(clap == 0)
   {
   digitalWrite(LASER, LOW);
   }
   
   Serial.print("Microphone: ");
   Serial.println(clap);
   */

  // Temperature ===========================================================
  sensors.requestTemperatures();
  float tempC = sensors.getTempC(insideThermometer);

  Serial.print("Temperatuur [C]: ");
  Serial.println(tempC);

  if(tempC > CMax)
  {
    CMax = tempC;  // for use on LCD
    Serial.print(" CMax          : ");
    Serial.println(CMax);
  }

  if(tempC < CMin)
  {
    CMin = tempC;  // for use on LCD
    Serial.print(" CMin          : ");
    Serial.println(CMin);
  }

  if(tempC >= 21.0)  // glow red
  {
    digitalWrite(RED, HIGH);
    digitalWrite(GREEN, LOW);
    digitalWrite(BLUE, LOW);
  }
  if((tempC >= 15.0) && (tempC < 21.0))  // glow blue
  {
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, HIGH);
    digitalWrite(BLUE, LOW);
  }
  if(tempC < 15.0)  // glow green
  {
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, LOW);
    digitalWrite(BLUE, HIGH);
  }

  // Sonar =================================================================
  // Start ranging
  digitalWrite(LASER,LOW);
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);

  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;

  if (distance > 2500)
  {
    distance = 0;
  }

  else
  {
    Serial.print("Afstand    [cm]: ");
    Serial.println(distance);
  }

  if(distance > 0.0 && distance < 10.00)
  {
    digitalWrite(LASER, HIGH);
  }

  // Clock =================================================================
  DateTime now = RTC.now();
  unsigned long nu = now.unixtime();

  // PIR ====================================================================
  byte moved = digitalRead(PIR);
  if (moved == 1)
  {
    Serial.println("Motion detected!");

    relayAan = (now.unixtime());
    relayUitLang = (now.unixtime() + 30 * 60);  // relay on for 30 minutes
    relayUitKort = (now.unixtime() +  1 * 60);  // relay on for 1 minute
  }

  if((now.hour()) < 7)  // before 7 o'clock
  {
    if(nu <= relayUitKort)
    {
      Serial.print("Time left relay on (<7h)   [s]: ");
      Serial.println(relayUitKort - nu);
      digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }

    if(nu > relayUitKort)
    {
      Serial.println("Relay          : OFF");
      digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }

  if( ((now.hour()) >= 7) && ((now.hour()) < 22) )  // between 7 and 22 o'clock
  {
    if(nu <= relayUitLang)
    {
      Serial.print("Time left relay on (7-22u) [s]: ");
      Serial.println(relayUitLang - nu);
      digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }

    if(nu > relayUitLang)
    {
      Serial.println("Relay          : OFF");
      digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }

  if( (now.hour()) >= 22)  // after 22 o'clock
  {
    if(nu <= relayUitKort)
    {
      Serial.print("Time left relay on (>22h)  [s]: ");
      Serial.println(relayUitKort - nu);
      digitalWrite(RELAY, HIGH);  // turn RELAY ON
    }

    if(nu > relayUitKort)
    {
      Serial.println("Relay          : OFF");
      digitalWrite(RELAY, LOW);  // turn RELAY OFF
    }
  }

  // LCD ====================================================================
  u8g.firstPage(); 
  do
  {
    draw(now, weekdays, regel, kolom, distance, tempC, CMin, CMax, moved);
  }

  while( u8g.nextPage() );

  // rebuild the picture after some delay
  //delay(100);

  // Screensaver ================================================================
  nSinceStart ++;
  if(nSinceStart % 100 == 0)
  {
    regel ++;
    kolom ++;
    if(regel>4)
    {
      regel = 1;
    }
    if(kolom>2)
    {
      kolom = 0;
    }
  }

}


// Required Functions ===========================================================================================

// Write to LCD ===============================================================
void draw(DateTime now, String weekdays[], byte regel, byte kolom, float distance, float tempC, float CMin, float CMax, byte moved)
{

  //DATUM ====================================
  u8g.setFont(u8g_font_5x7);
  u8g.setPrintPos(kolom, 10+regel);
  u8g.print("=");
  u8g.print(weekdays[now.dayOfWeek()]);
  u8g.print(" ");
  u8g.print(now.day(), DEC);
  u8g.print(".");
  u8g.print(now.month(), DEC);
  u8g.print(".");
  u8g.print(now.year(), DEC);

  u8g.print(" ");

  u8g.print(now.hour(), DEC);
  u8g.print(":");
  u8g.print(now.minute(), DEC);
  u8g.print(":");
  u8g.print(now.second(), DEC);
  u8g.print("=");

  //AFSTAND ===================================
  u8g.setFont(u8g_font_7x14);
  u8g.setPrintPos(kolom, 30+regel);
  u8g.print("Afstand: ");
  if(distance == 0)
  {
    u8g.print("-    ");
  }
  else
  {
    u8g.print(distance);
  }
  if(moved==1)
  {
    u8g.print("  *");
  }

  //TEMPERATUUR ===============================
  u8g.setFont(u8g_font_7x14);
  u8g.setPrintPos(kolom, 45+regel);
  u8g.print("Temperatuur: ");
  u8g.print(tempC);

  u8g.setFont(u8g_font_5x7);
  u8g.setPrintPos(kolom, 57+regel);
  u8g.print(" Min: ");
  u8g.print(CMin);
  u8g.print(" - Max: ");
  u8g.print(CMax);

}

// Convert normal decimal numbers to binary coded decimal =====================
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal number ======================
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Re: Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 22:58

In EEN keer, ontzettend bedankt! Super dat dit soort fora bestaan en experts als jij die snel met goeie oplossingen komen!

Berichten: 6
Geregistreerd: 12 Dec 2012, 00:28

Re: Listener voor klap sensor?

Berichtdoor MarkyMark » 12 Dec 2012, 23:53

Helaas toch nog een vervolgvraag.

Is het ook mogelijk om binnen clapDetect de waarde van het object 'DateTime now' te laten bepalen? De compiler vindt het niet leuk iig...

// Interrupt ====================================================================================================
volatile int clap = 0;
volatile DateTime now = RTC.now();

void clapDetect(DateTime now)
{
clap = 1;
relayAan = now.unixtime();
relayUitLang = (now.unixtime() + 30 * 60); // relay on for 30 minutes
relayUitKort = (now.unixtime() + 1 * 60); // relay on for 1 minute
}


// Setup ========================================================================================================
void setup(void) {

//Setup serial cummunication =================================================
Serial.begin(115200);

//Setup Interrupt sound module ===============================================
attachInterrupt(0, clapDetect(DateTime now), RISING);

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Listener voor klap sensor?

Berichtdoor pjh » 13 Dec 2012, 18:33

Wat je hierboven schrijft kan niet.
Je kunt (naar mijn beste weten) geen variabelen meegeven aan een void die voor de interrupt is bedoeld.
Verder is het zo, dat omdat de interrupt de gewone loop onderbreekt, je het zo klein mogelijk/ kort mogelijk wil houden wat er in de interruptroutne gebeurt.

Interessanter is waar je de etc voor gebruikt. Wat wil je timen, of waar wil je de tijd aanhangen?

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ooladixih en 16 gasten