Go Down

Topic: Scatch schreiben. (Read 227 times) previous topic - next topic

01010101Andy01010101

Hallo,

Könte mir den einer von euch einen scatch schreiben. Hab leider überhaupt keine Ahnung vom programmieren. Mache eine Ausbildung zum Elektriker mit dem verkabeln Kenn ich mich dafür eher aus ;-)
Nur hab ich null Ahnung vom programmieren.

Mein plan wäre für meine Solaranlage also für den Batterie und Technik schrank eine Alarmanlage zu bauen.

Wenn die Schranktür geöffnet wird soll jede Sekunde ein Piepton ertönen und nach 10 Sekunden ein dauer piepton ertönen der aber wiederum nach 20min Komplet ausgehen soll und aus bleiben soll. Die 10 Sekunden bis zum Daueralarm sollen dafür genutzt werden, wenn ich den schrank öffne um einen Taster im schrank zu betätigen der den Alarm abschaltet. mit diesem Taster möchte ich den Alarm aber wider einschalten. Wenn ich den Taster betätige soll jede Sekunde ein Piepton ertönen (auch wider 10 Sekunden) dann 3 Sekunden am stück. dann soll die Alarmanlage wider scharf sein. in den 10 Sekunden hab ich zeit die Tür wider zu schließen. 

wäre sowas möglich könte mir jemand sowas als scatch schreiben?  : smiley-rot: 


arduino uno hab ich schon zuhause

der pieper
----
https://www.ebay.de/itm/2PCS-SFM-27-DC-3-24V-90DB-Continuous-Beep-Alarm-Electronic-Buzzer-Sounder-Nw/113758010258?_trkparms=aid%3D555018%26algo%3DPL.SIM%26ao%3D1%26asc%3D20131003132420%26meid%3D035a3bfca7f045b78ecabcdb3354e831%26pid%3D100005%26rk%3D2%26rkt%3D6%26sd%3D253002032816%26itm%3D113758010258%26pmt%3D1%26noa%3D0%26pg%3D2047675&_trksid=p2047675.c100005.m1851 


schalter für die tür
------
https://www.ebay.de/itm/Micro-Roller-Hebel-Arm-Offnen-schliesen-Endschalter-KW12-3-PCB-Mikroschalter-Ew/113829374490?hash=item1a80c26a1a:g:StoAAOSw5dNWiNTX


und halt noch ein normalen taster




Ich möchte jetzt auch nicht unhöflich wirken.....

lg   

Tommy56

Du meinst nach 20 min Dauerbeschallung haben Deine Nachbarn noch nicht die Axt ausgepackt und das Ding zum Schweigen gebracht?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Wenn du schon alles zu Hause hast, warum schreibst du den Sketch nicht selber ?
Lernen kann man das und macht nicht dümmer.

Zumal ein solches Projekt solltest du kaufen oder selbst erstellen.
Bei Regressansprüchen solltest du schon wissen, wer dafür verantwortlich ist.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Es gibt Bestimmungen, nach welcher Zeit z.B. eine KFZ-Alarm-Anlage wieder aus sein muß.
Die darf auch nicht den ganzen Weg bis nach Russland (durch Polen) plärren ... außerdem wäre dann die Batterie leer ;)

Denke, länger darf auch Dein Piepser nicht für Unterhaltung sorgen.

Aber: Ja, die einzelnen Aktionen kannst Du nacheinander, quasi schrittweise, abarbeiten - dafür würde sich eine Schritt-Kette/State-Maschine/Endlicher Automat anbieten.
Das sollte sich bauen lassen.

Nur, wie schon geschrieben wurde - der Käfer MUSS nach x Sekunden wieder still sein - ganz egal, was dem Arduino im Inneren so feines passiert!
(meine Wahl wäre auf jeden Fall irgendwas mit WatchDog, spätestens, wenn das Geplärre los geht)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

agmue

#4
Sep 12, 2019, 09:30 pm Last Edit: Sep 12, 2019, 09:31 pm by agmue
Mache eine Ausbildung zum Elektriker ...
Dein Pieper benötigt 20 mA, das ist für einen Arduino-Pin grenzwertig, daher fehlt in Deiner Hardwareliste noch ein Relais oder ein Transistor.

Außerdem möchte der Pieper 12 V, also brauchst Du eine 12 V Versorgung aus Netzteil oder Batterie. Damit der Längsregler des Arduino nicht Leistung verheizt, empfehle ich einen StepDown(Schalt)-Regler auf 5V.

wäre sowas möglich könte mir jemand sowas als scatch schreiben?  : smiley-rot:  
Möglich ja, programmieren darfst Du selber :)

Aber einen Denkanstoß kann ich geben:

Code: [Select]
const byte tasterpin = 2, tuerpin = 3, pieperpin = 8;  // Anschluesse
const uint32_t scharf = 1000, piepein = 100, piepaus = 900, piepdauer = 5000, piepstop = 10000;  // Zeiten in ms
uint32_t jetzt;

void setup (void) {
  pinMode(tasterpin, INPUT_PULLUP);  // aktiv nach GND
  pinMode(tuerpin, INPUT_PULLUP);    // aktiv nach GND
  pinMode(pieperpin, OUTPUT);
}
enum {SCHARF, PIEP, ALARM, AUS};     // Zustände der Schrittkette
void loop (void) {
  jetzt = millis();
  static uint32_t vorhin = 0;
  static byte schritt = SCHARF;
  switch (schritt) {
    default:
      schritt = SCHARF;
    case SCHARF:
      if (jetzt - vorhin >= scharf) {
        if (digitalRead(tuerpin)) {
          vorhin = jetzt;
          schritt = PIEP;
        }
      }
      break;
    case PIEP:
      piep();
      if (!digitalRead(tasterpin)) {
        digitalWrite(pieperpin, LOW);
        schritt = AUS;
      }
      if (jetzt - vorhin >= piepdauer) {
        digitalWrite(pieperpin, HIGH);
        vorhin = jetzt;
        schritt = ALARM;
      }
      break;
    case ALARM:
      if (!digitalRead(tasterpin)) {
        digitalWrite(pieperpin, LOW);
        schritt = AUS;
      }
      if (jetzt - vorhin >= piepstop) {
        digitalWrite(pieperpin, LOW);
        schritt = AUS;
      }
      break;
    case AUS:
      if (!digitalRead(tuerpin)) {
        vorhin = jetzt;
        schritt = SCHARF;
      }
      break;
  }
}

void piep() {
  static uint32_t vorhin = 0, intervall = piepein;
  if (jetzt - vorhin >= intervall) {
    vorhin = jetzt;
    if (digitalRead(pieperpin)) {
      digitalWrite(pieperpin, LOW);
      intervall = piepaus;
    } else {
      digitalWrite(pieperpin, HIGH);
      intervall = piepein;
    }
  }
}

Das macht fast, was Du möchtest, aber das Scharfschalten erfolgt durch Tür zu.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Deltaflyer

Nicht so elegant wie agmues Lösung, entspricht jedoch genau Deiner Aufgabenstellung.
getestet auf Uno.
Code: [Select]

/*-------------------------------------------------------------------------
  ****************** SCATCH ALARMANLAGE (c) 2019 by SMC *******************
  -------------------------------------------------------------------------*/

bool AlarmOut = LOW;            // Schaltlogik für Alarm-Ausgang
                                // HIGH = aktiv HIGH  /  LOW = aktiv LOW
bool autoaktivate = true;       // Wenn Türe geschlossen wird, und das Scharfstellen
//   vergessen wird, bewirkt "true" ein automatisches Scharfstellen der Anlage
// wird jedoch Tür geöffnet, und gleich wieder geschlossen (innerhald der 10 Sek.)
// gibt es trotzdem nach 10 Sek. ALARM.
// wenn Du auf die Sicherheit des Automatischen Scharfstellen verzichten möchtest,
// schreibe anstatt 'true' einfach 'false'

const uint8_t On = AlarmOut;     // Piepser ein
const uint8_t Off = !AlarmOut;   // Piepser aus

const int doorswitchPin = 4;   // Türschalter an D4 vom Uno nach GND schaltend
const int alarmswitchPin = 5;  // Taster für alarm ein/aus an D5 vom Uno nach GND schaltend
const int hornPin =  6;        // Pieper (Pieper-Relais)

unsigned long alarm_maxdauer = 1200000;  // 20 min = 1'200'000 ms  Dauerton
unsigned long alarm_delay10  = 10000;    // 10 Sekunden Verzögerung für Alarm aus / Tür zu
unsigned long alarm_quittung =  3000;    // 3 Sekunden Quitierung mit Beep
unsigned long beep_pause = 750;          // Interval Ton Pause
unsigned long beep_dauer = 350;          // interval Ton Länge
unsigned long quittstart = 0;            // Startzeitpunkt der 3 Sek. Q
unsigned long alarmstart = 0;            // Startzeitpunkt vom Alarm
unsigned long delaystart = 0;            // Startzeitpunkt der 10 Sek. Verzögerung
unsigned long intervalstart = 0;         // Startzeitpunkt Interval für beep / Sek.

bool alarm_scharf = false;
bool to_aktivate = false;
bool aktive_quit = false;
bool alarm_warn = false;
bool door_open = false;
bool keyswitch = false;
bool alarm_on = false;
bool warnton = false;


void setup() {
  pinMode (doorswitchPin , INPUT_PULLUP);  // Pin 4 auf Eingang und PULLUP einschalten
  pinMode (alarmswitchPin , INPUT_PULLUP); // Pin 5 auf Eingang und PULLUP einschalten
  pinMode (hornPin , OUTPUT);              // Pin 6 auf Ausgang schalten
  digitalWrite (hornPin , Off);            // Pin 6 auf Piepser aus
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  alarm_scharf = true;
}
// ----------------------- setup ende -----------------

void loop() {
  if (digitalRead(doorswitchPin) == LOW)  // wenn die Schaltschrank Tür offen ist
  {
    keyswitch =! digitalRead(alarmswitchPin);
    if (door_open == true)
    {
      if (keyswitch == true)               // Taste im Schrank gedrückt
      {
        if (alarm_scharf == true)          // Wenn Alarmanlage scharf
        {
          if  (alarm_warn == true)         // während der Alarmverzögerung
          {
            digitalWrite(hornPin, Off);    // Piepser ausschalten
            warnton = false;               // Piepser ist aus
            alarm_warn = false;            // Alarm Verzögerung aus
            alarm_scharf = false;          // Alarmanlage nicht mehr scharf
          } 
          else
          {
            if (alarm_on == true)          // Wenn bereits Alarm
            {
              Alarm(0);                    // Alarm ausschalten
            }
          }
        }
        else
        {                                 // Alarmanlage scharfstellen
          if (alarm_warn == false)
          {
            Alarm_Warn();                 // Alarmverzögerung ein
            to_aktivate = true;           // true = warten bis Tür zu
          }
        }
        while (keyswitch == HIGH)         // warten bis Taste losgelassen 
        {
          keyswitch =! digitalRead(alarmswitchPin); // taste abfragen
          delay(100);
        }
      }   
    }
    else
    {
      door_open = true;                   // wenn die Tür vorher zu war
      Alarm_Warn();                       // 10 Sekunden Verzögerung starten
    }
  }
  else
  {                                       // Tür ist zu
    if (to_aktivate == true)    // Tür geschlossen, nach Tastendruck zum scharfstellen
    {
      digitalWrite(hornPin, Off);   // Piepser ausschalten
      warnton = false;              // Piepser ist aus
      alarm_warn = false;           // Alarm Verzögerung aus
      to_aktivate = false;          // vorbereitung zum scharfstellen fertig
      delay(50);                    // Verzögerung wegen evt. Tastenprellen
      Aktivate_Quit();              // Scharfstellen aufrufen
    }
    else
    {
      if (alarm_scharf == false && aktive_quit == false && autoaktivate == true)
      {            // Wenn Tür bei inaktivem Alarm geschlossen wird
        Aktivate_Quit();
      }
    }
  }
  digitalWrite(LED_BUILTIN, !alarm_scharf);  // led ein, wenn Alarm deaktiviert 
  if (aktive_quit == true) Aktivate_Quit();  // während 3 Sek. 'scharf' Bestätigung
  if (alarm_warn == true) Alarm_Warn();      // während 10 Sek. Alarmverzögerung
  if (alarm_on == true) Alarm(1);            // während 20 Minuten Alarm
}
// ---------------- loop ende ----------------

void Alarm_Warn()        // Alarmverzögerung
{
  if (alarm_warn == false)          // Alarm_Warn noch nicht gestartet
  {
    delaystart = millis();          // Startzeitpunkt der 10 Sek. Verzögerung
    intervalstart = millis();       // Startzeitpunkt des Interval für 1Sek. Beep
    digitalWrite(hornPin, On);      // Piepton einschalten
    alarm_warn = true;              // Alarm_Warn ist nun gestartet
    warnton = true;                 // Piepton ist ein
  }

  if (millis() - delaystart > alarm_delay10)   //wenn 10 Sekunden Verzögerung vorbei
  {
    digitalWrite(hornPin, Off);  // Warn-Piepser aussachalten
    delay(200);                  // ganz kurze Pause, damit Piepser still, bevor Alarm
    warnton = false;             // Warnton ist aus
    alarm_warn = false;          // Alarm Verzögerung aus
    Alarm(1);                    // Alarm wird ausgelöst
  }
  else
  {
    if (warnton == true)              // wenn warnton während der 10 Sek
    {
      if (millis() - intervalstart > beep_dauer)  // Länge für Piepton erreicht
      {
        digitalWrite(hornPin, Off);  // Piepton ausschalten
        warnton = false;             // Piepton ist aus
        intervalstart = millis();    // Interval für Piep-Pause starten
      }
    }
    else
    {
      if (millis() - intervalstart > beep_pause)   // Länge der Piep-Pause erreicht
      {
        digitalWrite(hornPin, On);   // Piepton einschalten
        warnton = true;              // Piepton ist ein
        intervalstart = millis();    // Interval für Piep-Ton starten
      }
    }
  }
}


void Aktivate_Quit()             // 3 Sekunden dauerton danach Anlage scharfstellen
{
  if (aktive_quit == false)      // Alarmanlage soeben quittiert
  {
    digitalWrite(hornPin, On);   // Bestätigungs-Piepser einschalten
    quittstart = millis();       // Startzeitpunkt des Bestätigungs-Piepser
    aktive_quit = true;          // Quittierung aktiv
  }
  else
  {
    if (millis() - quittstart >= alarm_quittung)  // Wenn Quittierung erreicht
    {
      digitalWrite(hornPin, Off);                 // Quittirungs Piepser aus
      aktive_quit = false;                        // Quittierung beendet
      alarm_scharf = true;                        // Alarmanlage wieder scharf
      door_open = false;                          // Tür ist zu
    }
  }
}


void Alarm(bool onoff)    // Alarmierung
{
  if (onoff == 1 && (alarm_scharf == true || to_aktivate == true))  // Alarm ist aktiv / soll aktiviert werden
  {
    if (alarm_on == false)          // Alarm wurde soeben aktiviert
    {
      digitalWrite(hornPin, On);    // Alarmton einschalten
      alarmstart = millis();        // Startzeitpunkt des Alarms merken
      alarm_on = true;              // Alarm Dauerton ist eingeschaltet
    }
    else
    { // Alarm ist bereits aktiviert
      if (millis() - alarmstart >= alarm_maxdauer)  // wenn max. Alarmdauer erreicht
      {
        digitalWrite(hornPin, Off); // Alarm Dauerton ausschalten
        alarm_scharf = false;       // Alarmanlage nicht mehr scharf
        alarm_on = false;           // Alarm ist ausgeschaltet
      }
    }
  }
  else
  {             // Alarm sofort ausschalten
    digitalWrite(hornPin, Off);     // Alarm ausschalten
    alarm_scharf = false;           // Alarmanlage nicht mehr scharf
    alarm_on = false;               // Alarm ist aus 
  }
}

HotSystems

Ihr seit spitze.
Dann hoffen wir mal, der TO kann damit was anfangen und meldet sich wieder.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Deltaflyer

@Dieter, das wird er bestimmt, da bin ich mir sicher.

LG Stefan

Go Up