INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Codeschloss wieder schließen
05.05.2014, 19:34
Beitrag #1
Codeschloss wieder schließen
Hallo liebe Forengemeinde,

ich habe in der SuFu nichts gefunden, deshalb schreibe ich diesen Thread.

Ich bin ganz neu in Sachen Arduino und hänge an einem Codeschloss.

Folgendes ist Stand der Dinge:

Im Rahmen eines Agenten-Geocaches, findet man insgesamt 4 Zahlen zum entschärfen einer Bombe. Dadurch öffnet sich ein Fach in welchem das Logbuch liegt.

Das funktioniert soweit auch.

Zur Codeeingabe werden Potis verwendet.

Jetzt hänge ich daran, dass die Kiste wieder schließt, wenn der Code an den Potis wieder verstellt wird.

Klingt eigentlich simpel, aber ich weiss nicht wo ich ansetzen kann.

Basis ist ein Arduino Uno,
1602 I2C Display, 4 Potis und ein Modellbauservo.

Folgender Code:
Code:
#include <Wire.h> // Diese Lib fehlte und damit die I2C Ansteuerung
#include <LCD.h> // Standard LCD Funktionen
#include <LiquidCrystal_I2C.h> // Umsetzung I2C auf LCD parallel Interface
unsigned int tcnt2;
int int_counter = 0;
#include <Servo.h>
// Erzeugen eines Servo Objekts zur Servo Steuerung
Servo myservo;
// Variable zum Speichern der Position
int pos = 0;
int rot = 10; // Ausgabepin rote LED
int gruen = 11; // Ausgabepin gruene LED
int minute = 14;
int sekunde = 59; // Eine Stunde Zeit zum oeffnen
int p1=0;
int p2=0;
int p3=0;
int p4=0;
boolean kiste=false;
#define I2C_ADDR    0x3F  // Adresse anpassen
#define BACKLIGHT_PIN     3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup()
{
// Das Timer-Interrupt Zeugs findet man so im Netz
  /* First disable the timer overflow interrupt while we're configuring */  
  TIMSK2 &= ~(1<<TOIE2);  
  
  /* Configure timer2 in normal mode (pure counting, no PWM etc.) */  
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));  
  TCCR2B &= ~(1<<WGM22);  
  
  /* Select clock source: internal I/O clock */  
  ASSR &= ~(1<<AS2);  
  
  /* Disable Compare Match A interrupt enable (only want overflow) */  
  TIMSK2 &= ~(1<<OCIE2A);  
  
  /* Now configure the prescaler to CPU clock divided by 128 */  
  TCCR2B |= (1<<CS22)  | (1<<CS20); // Set bits  
  TCCR2B &= ~(1<<CS21);             // Clear bit  
  
  /* We need to calculate a proper value to load the timer counter.
   * The following loads the value 131 into the Timer 2 counter register
   * The math behind this is:
   * (CPU frequency) / (prescaler value) = 125000 Hz = 8us.
   * (desired period) / 8us = 125.
   * MAX(uint8) + 1 - 125 = 131;
   */  
  /* Save value globally for later reload in ISR */  
  tcnt2 = 131;    
  pinMode(rot, OUTPUT);
  pinMode(gruen, OUTPUT);
  myservo.attach(9);
  kisteZu();
  lcd.begin (16,2); // Muss in jedem Falle sein um Zeilen/Spalten zu deklarieren
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);   // Backlight an
  lcd.setBacklight(HIGH);
  lcd.home ();
  lcd.print("Bombe ist:");
  delay(2500);
  lcd.setCursor(0,2);
  lcd.print("Aktiviert");
  delay(4500);
  lcd.home ();
  lcd.clear ();
    lcd.print("Setze Timer auf:");
  delay(2500);
  lcd.setCursor(0,2);
  lcd.print("15 Minuten");
  delay(3500);
  lcd.clear();
  lcd.home ();
  lcd.print("Initialisiere");
  delay(1500);
  lcd.setCursor(0,2);
  lcd.print("Detonation");
  delay(3500);
  lcd.clear();
  lcd.home ();
  lcd.print("Erwarte Abbruch");
  lcd.setCursor(0,2);
  lcd.print("Code Eingabe");
  delay(3500);
  lcd.home ();
  lcd.clear ();
  /* Finally load end enable the timer */  
  TCNT2 = tcnt2;  
  TIMSK2 |= (1<<TOIE2);  
}
void loop()
{
  if (!kiste) {
    lcd.setCursor(0,1);
    lcd.print("Zeit:");
    lcd.setCursor(11,1);
    if (minute < 10) {
      lcd.print(0);
    }
    lcd.print(minute);
    lcd.print(":");
    if (sekunde < 10) {
      lcd.print(0);
    }
    lcd.print(sekunde);
    
    p1 = lesePoti(0);
    p2 = lesePoti(1);
    p3 = lesePoti(2);
    p4 = lesePoti(3);


    lcd.setCursor(0,0);
    lcd.print("Code: ");
    lcd.print(p1, DEC);
    lcd.print(":");
    lcd.print(p2, DEC);
    lcd.print(":");
    lcd.print(p3, DEC);
    lcd.print(":");
    lcd.print(p4, DEC);

     if (p1 == 0 && p2 ==8 && p3 == 1 && p4 == 5) { // Beispiel-Code: 1234
      kisteAuf();
    }
    if (minute == 0 && sekunde == 0) {
        // disable timer
        TIMSK2 &= ~(1<<TOIE2);
        lcd.setCursor(0,0);
        lcd.print("Die Zeit ist um!");
        delay(2000);
        kisteAuf(); // Ok, das ist einfach, kann man natuerlich anders machen
    }
    delay(100);
  } else {
    anzeige("Geschafft!", 0);
    delay(10000);
  }
}

void kisteAuf()
{
  // disable timer
  TIMSK2 &= ~(1<<TOIE2);
  digitalWrite(rot, LOW);
  digitalWrite(gruen, HIGH);
  lcd.clear();  
  kiste = true;
  lcd.setCursor(0,1);
    lcd.home ();
  lcd.print("Bombe ist:");
  delay(2500);
  lcd.setCursor(0,2);
  lcd.print("Deaktiviert");
  delay(4500);
  lcd.home ();
  lcd.clear ();
  myservo.write(130); // Servo geht in Auf-Stellung (170 Grad)
  delay(2000);
}

void kisteZu()
{
  digitalWrite(rot, HIGH);
  digitalWrite(gruen, LOW);
  lcd.setCursor(0,1);
  lcd.print("Kiste ist: zu ");
  myservo.write(70); // Servo geht in Zu-Stellung (2 Grad)
}

int lesePoti(int A0)
{
  int val = analogRead(A0);
  // der Wert vom Analog-Eingang (0..1023) wird gemappt auf 0..9
  return map(val, 0, 1023, 0, 9);
}

void anzeige(char* s, byte zeile)
{
  lcd.setCursor(0,zeile);
  lcd.print(s);
}

/* Hier ist die ISR vom Timer-Interrupt, da wird nur die Zeit gezählt (jede ms) */
ISR(TIMER2_OVF_vect) {  
   /* Reload the timer */  
   TCNT2 = tcnt2;  
   int_counter += 1;
   if (int_counter == 1000) {
     int_counter = 0;
     sekunde--;
     if (sekunde == 0) {
       if (minute == 0) {
         // disable timer
         TIMSK2 &= ~(1<<TOIE2);
       } else {
         minute--;
         sekunde = 59;
       }
     }
   }

}

Vielleicht habt ihr ja eine Idee?

Viele Grüße,
Oliver
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.05.2014, 21:07 (Dieser Beitrag wurde zuletzt bearbeitet: 05.05.2014 21:09 von Nanouk75.)
Beitrag #2
RE: Codeschloss wieder schließen
Manchmal sieht man den Wald vor Bäumen nicht.
If poti 1!= 0 usw.
KisteZu();
Erledigt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 284 27.08.2016 18:23
Letzter Beitrag: Binatone
  mal wieder ein kleines Problem mit blinken ohne delay :) Sbbfreack 6 1.728 06.07.2015 15:59
Letzter Beitrag: Sbbfreack
  wieder mal: Problem mit arrays als Fkt.-Parameter HaWe 13 1.261 13.05.2015 09:29
Letzter Beitrag: Thorsten Pferdekämper
  Mal wieder ein Lauflicht Legolas085 7 3.650 05.05.2015 08:38
Letzter Beitrag: Thorsten Pferdekämper
Question Mal wieder eine kleine Frage von mir aus Interesse Darkon 8 1.257 11.01.2015 12:56
Letzter Beitrag: Darkon

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste