Schliesssystem mit Wählscheibentelefon und CD-Laufwerk
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // basiert auf
  2. // http://gameonstage.blogspot.de/2013/08/level-3-tutorial1-arduino-kusst-telefon.html
  3. // und
  4. // http://www.instructables.com/id/Nintendo-Keyless-Entry-System/?ALLSTEPS
  5. int cdromPin = 5;
  6. int dialPin = 0; // Analog 0 für Messung am Telefon
  7. int dialVal = 0;
  8. int dialValStat = 0;
  9. int nummer = 0;
  10. int taste = 10;
  11. unsigned long int signalstart = 0;
  12. unsigned long int signalstop = 0;
  13. unsigned long int signalzeit = 0;
  14. unsigned long int keinsignalzeit = 0;
  15. unsigned long int auszeit = 250; // 200
  16. unsigned long int zwischenzeit = 170; // 100
  17. int midValue = 400; // der Schwellenwert um aufgelegt (LOW) von abgenommen (HIGH) zu unterscheiden
  18. boolean dialing = false;
  19. boolean aufgelegt = false;
  20. int code[4] = {1,2,3,4};
  21. int codepos = 0;
  22. bool correctCode = false;
  23. void setup() {
  24. // put your setup code here, to run once:
  25. pinMode(cdromPin, OUTPUT);
  26. pinMode(dialPin, INPUT);
  27. //Serial.begin(9600);
  28. }
  29. void loop() {
  30. if (analogRead(dialPin) > midValue)
  31. {
  32. dialVal = 1;
  33. } else {
  34. dialVal = 0;
  35. }
  36. /*
  37. * Wahlvorgang
  38. */
  39. if ( dialVal != dialValStat )
  40. {
  41. dialValStat = dialVal;
  42. // bei hochziehen der Waehlscheibe kommt einmalig ein Signal
  43. if (dialVal == HIGH)
  44. {
  45. dialing = true;
  46. if (aufgelegt)
  47. {
  48. //Serial.print("telefon ");
  49. //Serial.print("abgehoben");
  50. //Serial.println();
  51. aufgelegt = false;
  52. signalstop = millis();
  53. }
  54. }
  55. else if (dialVal == LOW)
  56. {
  57. signalstop = millis();
  58. nummer++;
  59. }
  60. }
  61. /*
  62. * Abfrage ob waehlscheibe runtergelaufen
  63. */
  64. keinsignalzeit = millis() - signalstop;
  65. if ( dialing == true )
  66. {
  67. if ( keinsignalzeit > zwischenzeit )
  68. {
  69. if (nummer == 10)
  70. {
  71. taste = 0;
  72. }
  73. else if (nummer > 0) {
  74. taste = nummer;
  75. }
  76. if (taste < 10)
  77. {
  78. if(codepos == 0 && code[0] == taste) {
  79. correctCode = true;
  80. } else {
  81. if(codepos <= 3 ) {
  82. if(code[codepos] != taste) {
  83. correctCode = false;
  84. }
  85. } else {
  86. //correctCode = false;
  87. // ignore additional numbers
  88. }
  89. }
  90. if(codepos < 4) {
  91. codepos++;
  92. }
  93. }
  94. dialing = false;
  95. nummer = 0;
  96. taste = 10;
  97. }
  98. }
  99. /*
  100. * abfrage ob hoerer aufgelegt
  101. */
  102. if ( dialVal == LOW )
  103. {
  104. if ( keinsignalzeit > auszeit && aufgelegt == false)
  105. {
  106. //Serial.print("telefon ");
  107. //Serial.print("aufgelegt");
  108. //Serial.println();
  109. aufgelegt = true;
  110. dialing = false;
  111. nummer = 0;
  112. taste = 10;
  113. if(correctCode && codepos == 4) {
  114. //Serial.println("Oeffnen");
  115. digitalWrite(cdromPin, HIGH);
  116. delay(500);
  117. digitalWrite(cdromPin, LOW);
  118. delay(5000);
  119. digitalWrite(cdromPin, HIGH);
  120. delay(500);
  121. digitalWrite(cdromPin, LOW);
  122. }
  123. correctCode = false;
  124. codepos = 0;
  125. }
  126. }
  127. }