GPS Toröffner Attiny85 Neo-6M

Hallo zusammen,

ich habe mir heute einen GPS gesteuerten Toröffner gebastelt.

Microcontroller Attiny 85 (5,00V läuft auf 8 Mhz)
GPS Modul Neo 6M

Sobald man in einen vordefinierten Bereich kommt soll der Öffner bestätigt werden, momentan hängt noch eine LED an dem Ausgang..

Für das Parken in der Tiefgarage wird ein Zuhause Bit gesetzt um beim erneuten losfahren das Tor automatisch öffnen zu lassen.

Zusätzlich soll der Öffner auch noch per Taster zum auslösen sein.

Das Script läuft grundsätzlich wie es soll nur leider mir einer gewissen Verzögerung ca 3 Sek bei Eintritt bzw Austritt aus der Zone.

Der Taster betätigt sofort den öffner.. Was könnte ich dagegen tun? oder ist der kleine Tiny an seiner Leistungsgrenze ?

Ich bin kein "Profiprogrammierer" sondern immer noch am Lernen daher bin ich für Vorschläge und Verbesserungen sehr Dankbar.

Ich bedanke mich schon mal im Vorraus und bin gespannt auf eure Beiträge

Gruß Regenwolf

/****************************************************************
 *                                                              *
 *   GPS Toröffner                                              *
 *                                                              *
 *   Öffnet per GPS oder per Tastendruck ein Tor                *
 *                                                              *
 *                                                              *
 *            Pin am ATtiny85  Funktion  Pin im Sketch          *
 *                                                              *
 *                                                              *
 *                                                              *
 *                   1   8    Reset   VCC                       *
 *                   2   7        3     2                       *
 *                   3   6        4     1                       *
 *                   4   5      GND     0                       *
 *                                                              *
 *                                                              *
 *                                                              *
 *                  Pinverbindung                               *
 *                  T85 3.3V    > GPS VCC                       *
 *                  T85 GND     > GPS GND                       *
 *                  T85 RX   3  > GPS TX                        *
 *                  T85 TX  99  > GPS RX                        *
 *                                                              *
 *                  Torsteuerung  0                             *
 *                  Taster        2                             *
 *                                                              *
 *                                                              *
*                  Autor:           Regenwolf                   *
*                  Datum:           15.06.2022                  *
*                  Microcontroller: Attiny85                    *
*                  GPS:             NEO-6M-0-001                *
 *                                                              *
 *                 V:3.2                                        *
 *                                                              *
 ***************************************************************/


#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>


bool zuhause;
const double Latmin = 52.22230;   
const double Latmax = 52.22290;
const double Lngmin = 33.33330; 
const double Lngmax = 33.33390;


TinyGPSPlus gps;

#define oeffner    PCINT0
#define taster     PCINT2
#define rx         PCINT3
#define tx         PCINT4


SoftwareSerial SerialGPS (rx, tx);

void setup() {

  zuhause = EEPROM.read(0);
  
  SerialGPS.begin(9600);
  
  pinMode(oeffner, OUTPUT);
  pinMode(taster, INPUT_PULLUP);
}

void loop() {

  // taster
  if (digitalRead(taster) == LOW) {
    digitalWrite(oeffner , HIGH);
    delay(5000);
    digitalWrite(oeffner, LOW);

  }

  while (SerialGPS.available() > 0) {
    gps.encode(SerialGPS.read());
  }
  
  // GPS
  if (gps.satellites.value () > 4)

  {

    if (  Latmin  < gps.location.lat()  &&  gps.location.lat() < Latmax


          && Lngmin < gps.location.lng()  &&  gps.location.lng() < Lngmax

       )
    {
      zuhause = true;
      EEPROM.update(0, zuhause);
      delay(5);
      

        

    } else {
      
      zuhause = false;
      EEPROM.update(0, zuhause);
      delay(5);
    }

  }

  // oeffner
  if (zuhause) {

    digitalWrite(oeffner, HIGH);
    delay(800);
    digitalWrite(oeffner, LOW);
    delay(800);


  }

}

Ich vermute mal, die Verzögerung liegt am GPS. Das braucht eine gewisse Zeit zur Erkennung.

1 Like

Selbst wenn das funktioniert, ist es dennoch Unfug!
Denn PCINTx ist für Pin Change Interrupts vorgesehen

#define oeffner    0  // uralter C Stil
const byte taster    = 2; // moderner
constexpr byte rx    = 3; //  C++
constexpr byte tx    {4}; // die beste, typsichere moderne C++ Variante
1 Like

Was spricht gegen

const byte rx(3);

?

Weiß nicht....
Ist eine weitere mögliche/gültige/alternative Schreibweise
Bringt zumindest keine Vorteile gegen über der Initialisierung per =
(oder ich sehe sie nur nicht)

const byte rx(3.14);
const byte tx{4.222};

E:\Programme\arduino\portable\sketchbook\sketch_jun16b\sketch_jun16b.ino:20:20: warning: narrowing conversion of '4.22200012e+0' from 'double' to 'byte' {aka 'unsigned char'} [-Wnarrowing]
   20 | const byte tx{4.222};
      |                    ^

Hey,
ich danke euch schon mal für die Antworten und Verbesserungsvorschläge wurden auch gleich übernommen.

Momentan versuche ich Delay durch millis zu ersetzten... So einfach es sich in der Theorie anhört.. So sehr verdreht man sich dann doch das Hirn.. :sweat_smile:

Dachte evtl bringt das meine Verzögerungen ein wenig raus.. leider zeigen die ersten Versuche das aber noch nicht.. Und aus dem GPS werde ich auch noch nicht ganz schlau... Teilweise braucht es ewig und 3 Tage bis es Satellitenempfang hat..

Jemand einen Tip für einen besseren Empfänger?

Update:
ok, ich bin da auf einer heißen Spur.. Die Spannungsversorgung spuckt mir da in die Suppe..

Ich habe teilweise zu niedrige Spannungen deswegen bekomme ich keinen GPS-Sync und der Tiny läuft auch nicht so wie er soll..

[code]
/****************************************************************
 *                                                              *
 *    GPS Toröffner                                             *
 *                                                              *
 *    Öffnet per GPS oder per Tastendruck ein Tor               *
 *                                                              *
 *                                                              *
 *             Pin am ATtiny85  Funktion  Pin                   *
 *                                                              *
 *                                                              *
 *                                                              *
 *                    1   8    Reset   VCC                      *
 *                    2   7        3     2                      *
 *                    3   6        4     1                      *
 *                    4   5      GND     0                      *
 *                                                              *
 *                                                              *
 *                                                              *
 *                   Pinverbindung                              *
 *                   T85 3.3V    > GPS VCC                      *
 *                   T85 GND     > GPS GND                      *
 *                   T85 RX   3  > GPS TX                       *
 *                   T85 TX   5  > GPS RX                       *
 *                                                              *
 *                   Torsteuerung  0                            *
 *                   ZuhauseLed    1                            *
 *                   Taster        2                            *
 *                                                              *
 *                                                              *
 *                  Autor:           Regenwolf                  *
 *                  Datum:           25.06.2022                 *
 *                  Microcontroller: Attiny85                   *
 *                  GPS:             NEO-6M-0-001               *
 *                                                              *
 *                  V:2.5                                       *
 *                                                              *
 ***************************************************************/

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>


bool zuhause = false;
bool tasterflag = false;
bool einmalflag = true;



// Zuhause
constexpr double Latmin{52.51769};
constexpr double Latmax{52.51951};
constexpr double Lngmin{13.37480};
constexpr double Lngmax{13.37737};

// Pins
constexpr byte oeffner{0};
constexpr byte zuhauseled{1};
constexpr byte taster{2};
constexpr byte rx{3};
constexpr byte tx{5};


// erst nach 15s wird zuhause auf false gesetzt 
unsigned long rueckstellzettel = 0;
const int rueckstellinterval = 15000;

// bei Tastendruck oder im Bereich wird für 6s auf den oeffner gedrückt
unsigned long tasterzettel = 0;
const int tasterinterval = 6000;

// wird benötigt damit der öffner nur einmal bei Eintritt in die Zone auslöst 
unsigned long einmalzettel = 0;

TinyGPSPlus gps;
SoftwareSerial SerialGPS(rx, tx);


void setup()
{


  zuhause = EEPROM.read(0);

  SerialGPS.begin(9600);
  pinMode(oeffner, OUTPUT);
  pinMode(zuhauseled, OUTPUT);
  pinMode(taster, INPUT_PULLUP);
}

void loop()
{


  // taster
  if (digitalRead(taster) == LOW)
  {
    tasterflag = true;
    tasterzettel = millis();
    fernbedienung();
  }

  // GPS Daten vom Modul einlesen
  while (SerialGPS.available() > 0)
  {
    gps.encode(SerialGPS.read());
  }

  // GPS Home Abfrage
  if (gps.satellites.value() > 4)

  {

    if (Latmin < gps.location.lat() && gps.location.lat() < Latmax

        && Lngmin < gps.location.lng() && gps.location.lng() < Lngmax)
    {

      rueckstellzettel = millis();

      zuhause = true;
      EEPROM.update(0, zuhause);
      delay(5);

    }
    else
    {

      if (!zuhause)
      {
        einmalzettel = millis();
        einmalflag = true;
      }

      if (millis() - rueckstellzettel >= rueckstellinterval)
      {
        zuhause = false;
        EEPROM.update(0, zuhause);
        delay(5);

      }
    }
  }
  else
  {
    rueckstellzettel = millis();
  }



  if (zuhause)
  {
    digitalWrite(zuhauseled, HIGH);
    fernbedienung();

  }
  else
  {
    digitalWrite(oeffner, LOW);
    digitalWrite(zuhauseled, LOW);
  }
}





void fernbedienung()
{
// wird einmal bei eintritt in die Zone für 6s ausgelöst 
  if (millis() - einmalzettel <= tasterinterval && !tasterflag && einmalflag)
  {
    digitalWrite(oeffner, HIGH);

  }
  else
  {
    digitalWrite(oeffner, LOW);
    einmalflag = false;

  }

// wird vom taster ausgelöst läuft 6s
  while (tasterflag)
  {
    if (millis() - tasterzettel <= tasterinterval && tasterflag)
    {
      digitalWrite(oeffner, HIGH);
    }
    else
    {
      digitalWrite(oeffner, LOW);
      tasterflag = false;
    }
  }


}
[/code]

Halloo,

ich wollte noch meinen fertigen Code zur Verfügung stellen. Kurze Erklärung zu dem ganzen..

Wenn man in den definierte Bereich kommt wird der Öffner für 6 sek betätigt und ein zuhauseflag wird gesetzt. Erst nach dem Verlassen und dem erneuten betreten des Bereiches wird der Öffner wieder ausgelöst.
Da ich in der TG Parke hatte ich immer wieder Probleme wenn das Signal kurz weg ist und die Position springt daher wird das Zuhauseflag erst nach 15 s zurückgesetz und nicht sofort.

Manuell kann über einen Taster der Öffner auch betätigt werden.

Mit dem oeffner steuere ich einen Transistor an der mir bei der Orginalfernbedienung der Garage auf den Taster drückt.

Wer noch Fragen oder Verbesserungsvorschläge immer her damit.

Gruß Regenwolf

Freut mich, dass es jetzt funktioniert und danke fürs Teilen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.