Elektronische Sleutel IB tag

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektronische Sleutel IB tag

Berichtdoor Koepel » 30 Jun 2019, 02:50

Helemaal correct :D

Terug naar jouw sketch.
Het is mogelijk om integers en tekst te combineren in één geheel (in een 'struct'), maar je kunt het net zo goed in aparte arrays zetten.

Dus bij de index van een multi-dimensionaal array staat de fijnste onderverdeling rechts, en de grove indeling links.
Je begint natuurlijk met de grove indeling, en dat zijn de twee keys.

Als in de loop() iets wordt gezocht, en het wordt gevonden, dan wordt er meestal een variabele gebruikt om te onthouden wat de index op dat moment was.
Lijkt het je wat om -1 te gebruiken als niets is gevonden ?

Hieronder staat een voorbeeld van hoe het zou kunnen, er zijn meerdere goede manieren om dit te doen.

Code: Alles selecteren
int keyIndex = -1;         // zet de default, -1 is niet gevonden
for( int i=0; i<2; i++)
{
  // vergelijk de 8 bytes van de keys
  // key gevonden ? dan heeft 'i' de waarde van de key.
  int aantalGelijk = 0;
  for( j=0; j<8; j++)
  {
    if( addr[j] == keys[i][j])
    {
      aantalGelijk++;
    }
  }
  if( aantalGelijk == 8)
  {
    // alle 8 goed, dan heeft 'i' de waarde van de juiste index. Dat onthouden.
    keyIndex = i;
  }
}


De 'memcmp()' functie vergelijkt twee stukken geheugen: http://www.cplusplus.com/reference/cstring/memcmp/.

Code: Alles selecteren
int keyIndex = -1;         // zet de default, -1 is niet gevonden
for( int i=0; i<2; i++)
{
  // vergelijk de 8 bytes van de keys
  // key gevonden ? dan heeft 'i' de waarde van de key.
  if( memcmp( addr, keys[i], 8) == 0)
  {
    keyIndex = i;
  }
}


Daarna is de 'keyIndex' -1 (niets gevonden) of het is de index van de key die ook de index van de namen is.

Code: Alles selecteren
if( keyIndex >= 0)   // was er iets gevonden ?
{
  Serial.print( "Key gevonden, het is ");
  Serial.println( namen[keyIndex]);
}
else
{
  Serial.println( "Niets gevonden");
}

Advertisement

Berichten: 11
Geregistreerd: 22 Jun 2019, 22:16

Re: Elektronische Sleutel IB tag

Berichtdoor Danny b » 30 Jun 2019, 21:39

Moet de code dan zo zijn ?
Code: Alles selecteren
#include <OneWire.h>

// ID's van twee iButton-sleutels           // en dit gedeelte geplaatst van jou
const byte keys[2][8] =
{
  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC},    // 00 00 00 00 01 00 00 DC
  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54},    // 00 00 00 00 01 00 00 54
};

const char * namen[2] = { "Tjeerd", "Wietske" };

int pinNumber = 2;     
OneWire ds(pinNumber);
 
void setup() {
 pinMode(3, OUTPUT);   


 Serial.begin(9600);
}
 
void loop() {
  byte addr[8];
  byte val1 = 0;
  byte val2 = 0;
 
  int keyIndex = -1;         // zet de default, -1 is niet gevonden
for( int i=0; i<2; i++)
{
  // vergelijk de 8 bytes van de keys
  // key gevonden ? dan heeft 'i' de waarde van de key.
  int aantalGelijk = 0;
  for( j=0; j<8; j++)
  {
    if( addr[j] == keys[i][j])
    {
      aantalGelijk++;
    }
  }
  if( aantalGelijk == 8)
  {
    // alle 8 goed, dan heeft 'i' de waarde van de juiste index. Dat onthouden.
    keyIndex = i;
  }

  if( keyIndex >= 0)   // was er iets gevonden ?
{
  Serial.print( "Key gevonden, het is ");
  Serial.println( namen[keyIndex]);
}
else
{
  Serial.println( "Niets gevonden");
}
}
 if (val1 == 8) {
     digitalWrite(3, HIGH);
     delay(1000);
     digitalWrite(3, LOW);   
  }

  if (val2 == 8) {
     digitalWrite(3, HIGH);
     delay(500);
     digitalWrite(3, LOW);   
  }   
}


als ik deze zo ingeef dan geeft hij de fout
exit status 1
'j' was not declared in this scope

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektronische Sleutel IB tag

Berichtdoor Koepel » 01 Jul 2019, 00:42

Oeps, foutje van mij :oops: Ik ben vergeten om 'j' te declareren. Dat kun je alsnog doen. Je mag hem globaal, lokaal, of binnen de for-loop declaren. De declaratie van 'i' is binnen de for-loop met int i=0;

Het gaat er niet om hoe de sketch moet zijn, het gaat er om dat jij de sketch kunt schrijven ;)
Wat wil je met "keyIndex", "val1" en "val2" gaan doen ?
Het gemakkelijkste is één variabele die met een getal aangeeft welke key gebruikt is.

Berichten: 11
Geregistreerd: 22 Jun 2019, 22:16

Re: Elektronische Sleutel IB tag

Berichtdoor Danny b » 01 Jul 2019, 18:38

De val1 en val2 is voor een relay aan te sturen die een een impuls geeft om de poort te openen.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektronische Sleutel IB tag

Berichtdoor Koepel » 01 Jul 2019, 20:00

Stel dat je 100 verschillende keys hebt, dan is het handig om een integer te hebben (met een waarde vanaf 0 tot en met 99) die aangeeft welke key het is. Die integer is vanzelfsprekend de index van een array.
Ik heb jouw 'val1' en 'val2' er uit gepoetst, en daar een variabele voor in de plaats gekozen die een index van het array is. In dit geval dezelfde index van beide arrays (de keys en de namen).

Dat is hoe het bijna altijd gaat, zodra er een lijst van gegevens is. De lijst is een array, en om iets uit te lijst te kiezen is er een integer die de index van dat array is.

Stel er is een array met: "maandag", "dinsdag", "woensdag", enzovoorts. Dan is er ook een variabele die aangeeft welke dag van de week het is.
Stel dat je een aantal verschillende melodieën kunt afspelen. Dan staan die melodieën waarschijnlijk in een array (of het is een array van pointers die wijzen naar de melodieën), en dan is er ook een variabele die aangeeft welke melodie afgespeeld moet worden.

Berichten: 11
Geregistreerd: 22 Jun 2019, 22:16

Re: Elektronische Sleutel IB tag

Berichtdoor Danny b » 01 Jul 2019, 20:17

Het is vooral voor de kinderen dat ik zo een systeem wil maken.
Wat je me uitlegt is begrijpelijke taal en kan goed volgen maar het ergste is de code uitschrijven en soms waar je deze moet plaatsen.
Zal eens een cursus moeten gaan volgen om alles beter te leren kennen.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektronische Sleutel IB tag

Berichtdoor Koepel » 06 Jul 2019, 18:54

Hou je wel het inspringen in de gaten ?
Een slordige tekst van de code zal ook wel slordig werken.
Het belangrijkste van een nette layout van de tekst is, dat een foutje sneller is gevonden.

Ik schreef:
Koepel schreef:Daarna is de 'keyIndex' -1 (niets gevonden) of het is de index van de key die ook de index van de namen is.
Ik bedoelde om het volgende deel ná de for-loop te zetten. Je hebt het er nu binnen geplaatst.

cpp code
int keyIndex = -1;         // zet de default, -1 is niet gevonden
for( int i=0; i<2; i++)
{
...
}

// Alles is nu doorzocht, en de 'keyIndex' heeft de waarde van de gevonden key.
// Tenzij de 'keyIndex' nog steeds -1 is, dan is er niets gevonden.

if( keyIndex >= 0) // was er iets gevonden ?
{
Serial.print( "Key gevonden, het is ");
Serial.println( namen[keyIndex]);

// Hier zou je dingen kunnen toevoegen.
// Bijvoorbeeld de eerste 1000ms en de tweede 500ms
if( keyIndex == 0)
{
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
}
else if( keyIndex == 1)
{
digitalWrite(3, HIGH);
delay(500);
digitalWrite(3, LOW);
}
}
else
{
Serial.println( "Niets gevonden");
}

Berichten: 11
Geregistreerd: 22 Jun 2019, 22:16

Re: Elektronische Sleutel IB tag

Berichtdoor Danny b » 09 Aug 2019, 15:53

Al even geleden drukke agenda met als vrijwilliger ( verantwoordelijke ) mee te werken aan een festival.

Nu terug wat rust gevonden en me dus maar even terug verdiept in deze code en heb het nu werkende.

Alvast bedankt iedereen die me geholpen heeft en me wat bijgeleerd heeft.

Vooral bedankt aan @Koepel voor de ondersteuning.

mvg Danny B

Berichten: 11
Geregistreerd: 22 Jun 2019, 22:16

Re: Elektronische Sleutel IB tag

Berichtdoor Danny b » 11 Aug 2019, 23:05

Nu was ik aan het denken zou ik er een wifi module ( esp8266 ) kunnen aan koppelen om een email te sturen.
Met de dag en datum en de naam wie de sleutel heeft gebruikt. Zodat ik weet wanneer deze thuis is gekomen.
Maar het grootste probleem is hier ken ik helemaal niets van hoe ik dit zou moeten programmeren.
Wie zou me er Kunnen mee helpen?

Mvg Danny B

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Elektronische Sleutel IB tag

Berichtdoor Koepel » 12 Aug 2019, 03:07

Waarom de ESP8266, de ESP32 is maar een euro duurder.
Zie ook: http://arduinoforum.nl/viewtopic.php?f=18&t=3790.
Als je een ESP32 met de "ESP-WROOM-32" module koopt, dan heb je de meest gangbare.

Er bestaat een library om email te versturen: https://github.com/grzesl/ESPMail.
Die heb ik nog niet geprobeerd.
Ik weet dus ook niet of die door alle beveiligingen heen komt. Google heeft bij GMail een extra beveiliging, dat maakt het lastig.
Een SMTP server bij je eigen ISP is meestal het gemakkelijkste.

Voor de ESP32 (en ook de ESP8266) had ik veel aan deze website: https://randomnerdtutorials.com/.

...enige tijd later...
Nou, dat viel niet mee. Die library compileerde niet eens en wordt niet onderhouden. Ik kreeg het wel aan de praat.
Mijn ISP heeft meerdere manieren om de SMTP server te benaderen, en uiteindelijk toch een manier gevonden die geaccepteerd werd.
Wil je dat ik iedere minuut de temperatuur naar je mail ? :lol:

Wijzigingen:
ESPMail.h: return( true); toevoegen aan de functie "begin()"
library.properties: architectures=esp8266,esp32

Al deze regels als commentaar:
Code: Alles selecteren
//  mail.addCC("cc@example.com");
//  mail.addBCC("bcc@example.com");
//  mail.addAttachment("test.txt", "This is content of attachment.");
//  Serial.print("\n\nESPMail ver:");
//  Serial.println( (const char *) mail.getVersion());
//  Serial.print("Mail subject:");
//  Serial.println(mail.getSubject());
//  Serial.print("\n\n");

En een aantal casts naar toegevoegd bij de strings: (const char *)

Vervolgens de SMTP server van mijn ISP ingevuld, met poort 25, met mijn inlognaam en wachtwoord.

Er ontbreekt een "Date" veld, daar reageert het spam filter op.

VorigeVolgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten