Listener voor klap sensor?
11 berichten
• Pagina 1 van 2 • 1, 2
Listener voor klap sensor?
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:
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
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
Re: Listener voor klap sensor?
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.
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.
Re: Listener voor klap sensor?
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?
Heb je toevallig een werkend stukje voorbeeldcode van een interrruptpin?
Re: Listener voor klap sensor?
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 .
------------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
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 .
------------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
Re: Listener voor klap sensor?
- 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.
Re: Listener voor klap sensor?
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.
NB: heb pin 6 en 2 omgedraaid. Zie toelichting in de sketch
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.
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) );
}
Re: Listener voor klap sensor?
In EEN keer, ontzettend bedankt! Super dat dit soort fora bestaan en experts als jij die snel met goeie oplossingen komen!
Re: Listener voor klap sensor?
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...
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);
Re: Listener voor klap sensor?
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?
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?
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten