/* * Metal Detector * based on the theremin by Martin Nawrath * * FreqCounter library wants input on pin 5 * calibrate switch input on pin 4 * speaker output on pin 8 */ #include //sample time for freq measurement, in milliseconds #define GateTime 50 //set the zero freq to some audible note #define ZeroNote 100 unsigned long frq; //latest measurement unsigned long frq_zero; //calibration, taken in free air unsigned int dds; int tune, diff; void setup() { pinMode(8, OUTPUT); //audio out pinMode(5, INPUT); //freq counter input pinMode(4, INPUT); //zero button //the first couple of readings after startup are worthless for (int j=0; j<10; j++) { FreqCounter::start(GateTime); while (FreqCounter::f_ready == 0) { //do nothing } frq_zero = FreqCounter::f_freq + ZeroNote; delay(100); } } void loop() { if(digitalRead(4) == 1) { //calibrate button is pressed FreqCounter::start(GateTime); while (FreqCounter::f_ready == 0) { //do nothing } frq_zero = FreqCounter::f_freq + ZeroNote; //Serial.print("Cal F = "); //Serial.println(10 * frq_zero); } else { //tune = tune + 1; FreqCounter::start(GateTime); while (FreqCounter::f_ready == 0) { // kind of DDS tonegenerator PORTB = ((dds += tune) >> 15); //portb.0 = arduino pin8 } frq = FreqCounter::f_freq; diff = frq - frq_zero; tune = abs(diff); //per the language manual, don't put an expression in abs() argument } }