Skip to content

Instantly share code, notes, and snippets.

Created September 30, 2012 04:49
Show Gist options
  • Select an option

  • Save anonymous/3805876 to your computer and use it in GitHub Desktop.

Select an option

Save anonymous/3805876 to your computer and use it in GitHub Desktop.
Arduino Rotary Phone dial Code
/*
****** Rotary Phone dial Code *****
Created 9 August 2012
By Andrew D. Farquharson
**output numbers dont match code as I am using a **
**New Zealand Rotary Phone where the numbers are layed out differently**
Rotary Phone Code From: http://www.instructables.com/id/Interface-a-rotary-phone-dial-to-an-Arduino/?ALLSTEPS
*/
int needToPrint = 0;
int count;
int in = 2;
int hanger = 3;
int lastState = LOW;
int trueState = LOW;
long lastStateChangeTime = 0;
int cleared = 0;
int number;
int onhook = 0;
// constants
int dialHasFinishedRotatingAfterMs = 100;
int debounceDelay = 10;
void setup()
{
Serial.begin(9600);
pinMode(hanger, INPUT);
pinMode(in, INPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A5, OUTPUT);
}
void loop()
{
int reading = digitalRead(in);
if ((millis() - lastStateChangeTime) > dialHasFinishedRotatingAfterMs) {
// the dial isn't being dialed, or has just finished being dialed.
if (needToPrint) {
// if it's only just finished being dialed, we need to send the number down the serial
// line and reset the count. We mod the count by 10 because '0' will send 10 pulses.
number = (count);
Serial.println(number);
if(number == 1){
Serial.println("press 9");
digitalWrite(8, HIGH);
delay(200);
digitalWrite(8, LOW);
}
if(number == 2){
Serial.println("press 8");
digitalWrite(7, HIGH);
delay(200);
digitalWrite(7, LOW);
}
if(number == 3){
Serial.println("press 7");
digitalWrite(6, HIGH);
delay(200);
digitalWrite(6, LOW);
}
if(number == 4){
Serial.println("press 6");
digitalWrite(11, HIGH);
delay(200);
digitalWrite(11, LOW);
}
if(number == 5){
Serial.println("press 5");
digitalWrite(10, HIGH);
delay(200);
digitalWrite(10, LOW);
}
if(number == 6){
Serial.println("pres 4");
digitalWrite(9, HIGH);
delay(200);
digitalWrite(9, LOW);
}
if(number == 7){
Serial.println("press 3");
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
}
if(number == 8){
Serial.println("press 2");
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
}
if(number == 9){
Serial.println("press 1");
digitalWrite(A0, HIGH);
delay(200);
digitalWrite(A0, LOW);
}
if(number == 10){
Serial.println("press 0");
digitalWrite(5, HIGH);
delay(200);
digitalWrite(5, LOW);
}
needToPrint = 0;
count = 0;
cleared = 0;
}
}
if (reading != lastState) {
lastStateChangeTime = millis();
}
if ((millis() - lastStateChangeTime) > debounceDelay) {
// debounce - this happens once it's stablized
if (reading != trueState) {
// this means that the switch has either just gone from closed->open or vice versa.
trueState = reading;
if (trueState == HIGH) {
// increment the count of pulses if it's gone high.
count++;
needToPrint = 1; // we'll need to print this number (once the dial has finished rotating)
}
}
}
lastState = reading;
// **This bit hangs up wor answers only when hand set is picked up or put down**
if(onhook == 0 && digitalRead(hanger) == 0){
onhook += 1;
Serial.println(" on hook ");
digitalWrite(A1, HIGH);
delay(200);
digitalWrite(A1, LOW);
delay(1000);
}
if(onhook == 1 && digitalRead(hanger) == 1){
onhook = 0;
Serial.println(" off hook ");
digitalWrite(A5, HIGH);
delay(200);
digitalWrite(A5, LOW);
delay(1000);
}
//** end of hand send bit**
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment