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
Filmdatenbank mit Roboter und Barcodescan
10.12.2015, 20:48 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2015 20:54 von Wampo.)
Beitrag #1
Filmdatenbank mit Roboter und Barcodescan
Hy Hallo zusammen,

neue Flausen im Kopf.... Aktuell Arbeite ich an meinem nächsten Dicken Projekt
Blu-Ray Datenbankschrank mit Roboterbedienung und Barcodescanner


Wie der Titel ja schon verrät is das kein zwei Tages Projekt Big Grin

Die ersten Grundsteine habe ich heute jedoch bereits gelegt.
Eine Filmabfrage über das Internet via Barcodescanner.
       
Zuerst wollte ich Amazons Datenbank per API Zugang benutzen, jedoch empfand ich den Zugang und die Umgebung irgendwie zu aufgewühlt, ich hatte kein Durchblick alles irgendwie nur auf einen haufen geschmissen. Zudem kommt hinzu das ich nicht rausfinden konnte ob ich nun zahlen muss damit ich auf deren Datenbank zugreifen kann oder das als Entwickler kostenfrei ist. Ich denke eher das es Teuer wird bzw. nichts für meine zwecke.

Nach langem suchen fand ich dann ich dann eine recht gute brauchbare Datenbank. http://www.ofdb.de
Es stellte sich jedoch herraus das hier kein API zugang möglich war, das haben aber schon andere vor mir Festgestellt und irgend ein schlauer Fuchs hat ein Gateway zu der Datenbank eingerichtet, erreichbar unter http://www.ofdbgw.org/

Mit diesem Gateway lässt sich eine art API zugang einrichten, ich benutze hier jetzt die /GET HTTP/1.1 Methode über EAN Search.

Der Barcodescanner der auf den bildern zu sehen ist, ist ein Metrologic Orbit MS7120 mit RS232 Schnittstelle.
   
Ja das dacht ich mir auch Pfui RS232...hab den Kasten geöffnet und siehe da ein sehr Breiter Jumper an der Platine.
http://www.atol.ru/support/encyclopedy/t...nterfaces/

Schwupp und schon hat man am Ausgang vom Scanner ein PS/2 Signal anliegen.

Mit nem Configurationshandbuch wird dann der Rest eingestellt.

Aktuell beschränkt sich der Code noch auf das Lesen des Barcodes und Abfragen im Netz um welchen Titel es sich handelt und ausgeben auf das LCD.
Der Code ist nicht gerade Quick aber unheimlich Dirty.

Code:
// Bibliotheken einbinden
//================================================================================​=
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <ctype.h>

// LCD Configuration          
//================================================================================​=
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ZEICHEN 20
#define ZEILEN 4

// BarcodeScanner Confi        
//================================================================================​=
int clockPin = 3; // Clock is only output.
int dataPin  = 2; // The data pin is bi-directional  But at the moment we are only interested in receiving  

const int SCAN_ENTER = 0x5a;
const int SCAN_BREAK = 0xf0;
const int QUANTITY_CODES = 50; // number of supported codes/characters
const byte SCAN_CODES[QUANTITY_CODES] = {0x70, 0x69, 0x72, 0x7a, 0x6b, 0x73, 0x74, 0x6c, 0x75, 0x7d, 0x1c, 0x32, 0x21, 0x23, 0x24, 0x2b, 0x34, 0x33, 0x43, 0x3b, 0x42, 0x4b, 0x3a, 0x31, 0x44, 0x4d, 0x15, 0x2d, 0x1b, 0x2c, 0x3c, 0x2a, 0x1d, 0x22, 0x35, 0x1a, 0x16, 0x1e, 0x26, 0x25, 0x2e, 0x36, 0x3d, 0x3e, 0x46, 0x45, 0x29, 0x41, 0x49, 0x4a};
const char CHARACTERS[QUANTITY_CODES] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', ',', '.', '/'};

// Variablen          
//================================================================================​=
const int SDselect = 4;
const int ETHselect = 10;

boolean requested;                            // whether you've made a request since connecting
String currentLine = "";                      // string to hold the text from server
String fbcount = "";                          // string to hold the tweet
boolean readingFbcount = false;               // if you're currently reading the tweet


int breakActive = 0; // boolean toggled by SCAN_BREAK scan code
int clockValue = 0;
byte dataValue;

const int BUFFER_LENG = 20;
char buffer[BUFFER_LENG];      // serial input buffer
int bufferPos = 0;
uint8_t bufferidx = 0;
uint32_t tmp;
uint8_t i;

// buffer for scanned codes
char nameBuf[BUFFER_LENG];

// buffering scanned names
const unsigned long flushTime = 60000; // one minute
unsigned long lastNameScan;

// Ethernet Configuration          
//================================================================================​=
// IP Configuration in Windows unter Start --> Suche --> "CMD" --> "ipconfig/all"
byte     mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //MAC Adresse vom EthernetShield
byte      ip[] = { xxx, xxx, xxx, xxx};                    //IP  Adresse vom EthernetShield
byte gateway[] = { xxx, xxx, xxx, xxx };                    //Lokale Gateway Adresse
byte  subnet[] = { xxx, xxx, xxx, xxx };                    //Lokale Subnet  Adresse

char server[] = "ofdbgw.home-of-root.de";        
int port = 80;

EthernetClient client;

/*
* function prototypes
*/
void clearBuffer(char *buf);
void sendData();
int readData();


void setup() {
  
  pinMode(dataPin, INPUT); digitalWrite(dataPin, HIGH);                                              
  pinMode(clockPin, INPUT); digitalWrite(clockPin, HIGH);
  pinMode(ETHselect, OUTPUT); digitalWrite(ETHselect, LOW);               // Chipselect auf 'LOW' Aktiviert in dem fall Ethernetmodul
  pinMode(SDselect, OUTPUT); digitalWrite(SDselect, HIGH);               // Deaktiviert hier dann SD Karten Modul

  currentLine.reserve(256);
  fbcount.reserve(100);
  /*
   * Start Up
   */
  lcd.begin(ZEICHEN,ZEILEN);
  SPI.begin();
  Serial.begin(115200);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to Configure Ethernet");
    Ethernet.begin(mac, ip); // gateway, subnet);
  }
  lcd.setCursor(0,0);
  lcd.print("     !B:O:R! IP     ");
  lcd.setCursor(3,1);
  lcd.print(Ethernet.localIP()) ;

  delay(1000);
  
  lcd.setCursor(0,2);
  lcd.print(" Scan some BD-Stuff ") ;
}

void loop() {
if (client.connected()) {
     if (client.available()) {
      char inChar = client.read();                
        currentLine += inChar;
          Serial.print(inChar);
      // if you get a newline, clear the line:
      if (inChar == '\n')
      {
        currentLine = "";
      }
      
      // if the current line ends with <fan_count>, it will
      // be followed by the tweet:
      if (currentLine.endsWith("<titel>")){                  
        
        // Likes gefunden, String Löschen
        readingFbcount = true;
        fbcount = "";
      }
    
      // if you're currently reading the bytes of the facebook count,
      // add them to the tweet String:
      if (readingFbcount)
      {
        if (inChar != '<' )
        {
          fbcount += (char)inChar;
        }
        else
        {
          // if you got a "<" character,
          // you've reached the end of the facebook
          readingFbcount = false;
          client.stop();
          fbcount.remove(0,1);            // erstes Zeichen vom String Löschen
          fbcount.remove(20);             // maximal 20 Zeichen darstellen rest löschen
      //int count = fbcount.toInt();      // convertierung von String in Integer
         lcd.setCursor(0,0); lcd.print("Film nach EAN: ");
         lcd.setCursor(0,1); lcd.print("                    ");
         lcd.setCursor(0,1); lcd.print(fbcount);
         lcd.setCursor(10,3); lcd.print("   Done   ");
      }
     }
    }
   }
  else {
scan();
  }
} // end of loop()

void scan(){
  // read data from scanner
  dataValue = readData();
  if (dataValue == SCAN_BREAK) {
    breakActive = 1;
  }

  // check for buffer overflow
  if (bufferPos < BUFFER_LENG) {
    // translate the scan codes to numbers
    // if there is a match, store it to the buffer
    for (int i = 0; i < QUANTITY_CODES; i++) {
      byte temp = SCAN_CODES[i];
      if (temp == dataValue) {
        if (!breakActive == 1) {
          buffer[bufferPos] = CHARACTERS[i];
          bufferPos++;
        } // end of breakActive
      } // end of "valid character"
    } // end of QUANTITY_CODES check
  }

  // code completely scanned
  if (dataValue == SCAN_ENTER) {
      
      // EAN was scanned
      Serial.print("EAN Code: ");
      Serial.print(buffer);
      Serial.println(" found");
      sendData();
      
      
    // clear buffer
    clearBuffer(buffer);
    bufferPos = 0;

  } // end of "SCAN_ENTER" check
  
  // Reset the SCAN_BREAK state if the byte was a normal one
  if (dataValue != SCAN_BREAK) {
    breakActive = 0;
  }
  dataValue = 0;
}
void sendData(){
  
    client.stop();
    delay(100);
    lcd.setCursor(0,3); lcd.print("Connection to Server");
if (client.connect(server, port)) {
    client.print("GET /searchean/");
    client.print(buffer);
    client.println(" HTTP/1.1");
    client.println("HOST: ofdbgw.home-of-root.de");
    client.println("Connection: close");
    client.println();

    lcd.setCursor(0,2); lcd.print("EAN: "); lcd.print(buffer); lcd.print("  ");
    lcd.setCursor(10,3); lcd.print("   i.O.   ");
  }
  else {
    // if you didn't get a connection to the server:
    lcd.setCursor(10,3); lcd.print(" N.i.O.   ");
  }
}
void clearBuffer(char *buf){
  int i=0;
  while
    (buf[i] != 0) {
    buf[i++] = 0;
  } // end of clear buffer loop
}
int readData(){
  byte val = 0;
  // Skip start state and start bit
  while (digitalRead(clockPin));   // Wait for LOW.
  // clock is high when idle
  while (!digitalRead(clockPin));  // Wait for HIGH.
  while (digitalRead(clockPin));  // Wait for LOW.
  for (int offset = 0; offset < 8; offset++) {
    while (digitalRead(clockPin));         // Wait for LOW
    val |= digitalRead(dataPin) << offset; // Add to byte
    while (!digitalRead(clockPin));        // Wait for HIGH
  }
  // Skipping parity and stop bits down here.
  while (digitalRead(clockPin));           // Wait for LOW.
  while (!digitalRead(clockPin));          // Wait for HIGH.
  while (digitalRead(clockPin));           // Wait for LOW.
  while (!digitalRead(clockPin));          // Wait for HIGH.
  return val;
}

Der Schrank bekommt sehr viele schlitze in dem die Blu Rays drin stecken.
Jede einzelne Position soll dann mit Daten hinterlegt gefüttert werden.
Auf der Speicherkarte sollen später folgenden Informationen in dieser Reihenfolge festgehalten werden:
♣Platznummer
♣Name des Titels
♣EAN Nummer
♣X Koordinate
♣Y Koordinate

So stell ich mir das vor:
Film Ausgeben:
EAN Barcode Scannen, Abfrage in der Bibliothek bei welchen Koordinaten sich der Film befindet, Koordinaten anfahren, Film Entnehmen und in die Ausgabe/Eingabe Station legen

Film Eingeben bzw. Hinzufügen:
Film Scannen, Film wird abgefragt ob dieser bereits in der Bibliothek vorhanden ist, ist der Film Vorhanden per EAN den Platz suchen wo dieser hingehört Film von Aus / Eingabeschacht holen und einsortieren
ist der Film nicht Vorhanden, dem Film einen neuen Leeren platz zuweisen


Positionsbestimmung und anfahren der Koordinaten per CNC Shield und DRV8825 StepSticks und Steppermotoren, evtl mit Encoder.

Soweit die Theorie, ich finde das isn schönes Projekt, wird bestimmt sau anstrengend aber machbar.

Greez Wampo


Angehängte Datei(en) Thumbnail(s)
               
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2015, 21:06 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2015 21:20 von Klaus(i).)
Beitrag #2
RE: Filmdatenbank mit Roboter und Barcodescan
Cooles Projekt.
Erinnert mich an eine Jukebox, wenn die hier noch jemand kennt Big Grin

Die lineare Variante




Die kreisförmige




Da gab es ganz viele Varianten.

Werde das Projekt verfolgen.

Gruß, Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2015, 14:05 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2015 16:16 von Wampo.)
Beitrag #3
Filmdatenbank mit Roboter und Barcodescan
Haha und schon hab ich nen neuen Namen fürs Projekt.

So nun die ersten Fragen bezüglich Strings, also ne STRING Theorie Big Grin

Benötigt werden ca. 400 Fächer, das heisst ergo für mich ich muss auch 400 mal den part String FachX erzeugen oder?

Kann man das irgendwie abwenden in dem man mit nem Array arbeitet aber trotzdem alle meine unten stehenden Infos bleiben und wieder einzeln lesbar sind?

Ist es möglich ohne großes heck meck den String wie folgt zu schreiben oder darf er nur zahlen beinhalten?!
Aufteilung wie folgt:
String Name = "Fach, EAN, Name, x Position, Y Position";
String Fach1 = "1, 4010884540970, True Grit, 50, 60";
String Fach2 = "2, 4010324039477, Iron Man 3, 150, 90";
String Fach3 = "3, 5051234......... und so weiter.

Bin für jeden tip dankbar, hab vor dem hier nie was mit dem Stringzeug zu tun.

Greez Wampo


Ich konnte mir gerade die Frage selber beantworten durch rumspielen mit den Beispielen, Ihr seit einfach zu langsam leute Big Grin

Hab mal eben was schnelles runtergeschrieben um zu sehen obs geht.
Also ist es möglich durch String dataString[maxplatz] = ""; ein Datensatz zu schreiben der auch 400 Plätze(Arrays) aufnehmen kann.

Jetzt aber ne andere Frage, wie kann ich das auf SD Karte schreiben das für jeden Platz ein neuer String angelegt wird?!

Code:
const int maxplatz = 3;
String fach[maxplatz] = "";
int i= 0;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  
}

void loop() {
  fach[0] = "1, 4010884540970, True Grit, 50, 60";
  fach[1] = "2, 1234567891546, Iron Man 3, 100, 120";
  fach[2] = "3, 5438644654120, Männertrip, 150, 180";

  Serial.print("Fach Nr  ");
  Serial.println(fach[i]);
  if (i<(maxplatz-1)){
    i++;
  }
else {
  i = 0;
}
delay(1500);

fach[i] = "";
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2015, 19:54 (Dieser Beitrag wurde zuletzt bearbeitet: 11.12.2015 19:56 von Klaus(i).)
Beitrag #4
RE: Filmdatenbank mit Roboter und Barcodescan
(11.12.2015 14:05)Wampo schrieb:  Hab mal eben was schnelles runtergeschrieben um zu sehen obs geht.
Also ist es möglich durch String dataString[maxplatz] = ""; ein Datensatz zu schreiben der auch 400 Plätze(Arrays) aufnehmen kann.
Du wirst aber kaum 400 Strings mit obigen Informationen gleichzeitig im Variablenspeicher halten können.
http://playground.arduino.cc/Learning/Memory

Bei 400 Strings a 30 Zeichen bist Du bei 12.000 Zeichen.
Somit musst Du deine Titel einzeln von der SD lesen.

Mit SD Lesen / Schreiben habe ich noch keine Erfahrung. Deswegen kann ich dir da nicht weiter helfen.

Gruß, Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.12.2015, 20:04
Beitrag #5
RE: Filmdatenbank mit Roboter und Barcodescan
Ok danke für die Info, daran hab ich jetzt gar nicht gedacht.

Ich möchte eigentlich auch alle Bibliothek daten auf die SD auslagern im .txt und bei bedarf abfragen.

Bis jetzt krieg ich noch nicht mal n vergleich hin ob die EAN schon in der Bibliothek zu finden ist. Sad
Bzw. wenn nicht gefunden dann neuen String schreiben.

Falls jemand gloreiche ideen zum Thema Datenbank hat, die man immer wieder einzeln abrufen kann, löschen kann, neu schreiben usw...eben ne Datenbank dann bitt um hilfe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.12.2015, 00:45 (Dieser Beitrag wurde zuletzt bearbeitet: 19.12.2015 01:09 von Wampo.)
Beitrag #6
RE: Filmdatenbank mit Roboter und Barcodescan
Es sind wieder viele Stunden Übungsmaterial und Übungssketche drauf gegangen aber nun funktioniert es soweit ich es ausprobieren kann.
Solangsam verstehe ich wie sich Bugs in ein Programm einschleichen, ich versuche von Haus aus Bug-frei zu Arbeiten aber das ist gar nicht so einfach.
Aktuell erledigter Ablaufplan
   
Was kann der Code bis jetzt:
♣Scannen von Barcodes
♣Abfragen des Barcodes im Internet via Mirror und Gateway
♣Ausgeben des Titels vom Film auf LCD
♣Nach Scannen prüfen ob Film (via EAN CODE) schon auf SD Karte (DATABASE) vorhanden, wenn nicht dann in neue Zeile auf SD Karte schreiben --> EAN; FACH NUMMER; FILM TITEL

Anbei das Code Update von Der BluRay Juke Box

P.S.: Weiß jemand ob man G Codes Direkt per Arduino Programm an GRBL Lib zu senden? Also nicht ber Serial und auch nicht über einen zweiten Ardu. Soll am besten alles von einem MEGA laufen.

Code:
/*
* Blu-Ray-Jukebox mit Roboterbedienung und Barcodescanner, erstellt von Daniel Agocs
* Projekt ins Leben gerufen am 01.12.2015
*
* Update Historie:
* 05.12.15 // V1.0 = Einbindung Barcodescanner, Textfinder und Ethernetverbindung // Spielerei:  WS2812b LED // Sketch 22.698 Bytes
* 11.12.15 // V1.1 = Einbindung SD Karte auf Ethernet Shield, Anpassung an Arduino Mega, Strukturierung
* 12.12.15 // V1.2 = Ethernet.h geändert (Verbindungstimeout von 60 auf 10 sec), SD und Ethernet Startsequence Optimiert
* 18.12.15 // V1.3 = SD Vergleich, SD Beschreiben wenn Daten nicht vorhanden, Weiterentwicklung und Bug Fixes // Sketch 32.686 Bytes
*
* Copyright by Daniel Agocs and iNET BLU-RAY JUKEBOX
*/


// Bibliotheken einbinden
//================================================================================​=
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <ctype.h>
#include <Adafruit_NeoPixel.h>
#include <SdFat.h>

// Database Confi      
//================================================================================​=
bool db = false;
bool match;
unsigned int fach = 1;

// SD Confi          
//================================================================================​=
const int SDselect = 4;
SdFat sd;
SdFile myFile;

// NeoPixel Confi          
//================================================================================​=
#define NUMPIX 24
#define PIN 6
int wc = 8;  //Color Changer ++
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIX,PIN,NEO_GRB + NEO_KHZ800);

// LCD Confi        
//================================================================================​=
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ZEICHEN 20
#define ZEILEN 4

// BarcodeScanner Confi        
//================================================================================​=
int clockPin = 3;
int dataPin  = 2;

const int SCAN_ENTER = 0x5a;
const int SCAN_BREAK = 0xf0;
const int QUANTITY_CODES = 50;               // Menge der unterstützten Codes/Characters
const byte SCAN_CODES[QUANTITY_CODES] = {0x70, 0x69, 0x72, 0x7a, 0x6b, 0x73, 0x74, 0x6c, 0x75, 0x7d, 0x1c, 0x32, 0x21, 0x23, 0x24, 0x2b, 0x34, 0x33, 0x43, 0x3b, 0x42, 0x4b, 0x3a, 0x31, 0x44, 0x4d, 0x15, 0x2d, 0x1b, 0x2c, 0x3c, 0x2a, 0x1d, 0x22, 0x35, 0x1a, 0x16, 0x1e, 0x26, 0x25, 0x2e, 0x36, 0x3d, 0x3e, 0x46, 0x45, 0x29, 0x41, 0x49, 0x4a};
const char CHARACTERS[QUANTITY_CODES] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ', ',', '.', '/'};

// Variablen Confi    
//================================================================================​=
boolean requested;                           // whether you've made a request since connecting
String  currentLine = "";                    // string to hold the text from server
String  titel = "";                          // string to hold the tweet
boolean readingTitel = false;                // if you're currently reading the tweet

int breakActive = 0;                         // boolean toggled by SCAN_BREAK scan code
int clockValue = 0;
byte dataValue;

const int BUFFER_LENG = 20;
char buffer[BUFFER_LENG];                    // serial input buffer
int bufferPos = 0;

unsigned long Start = 0;
unsigned long Stop = 0;
float Ergebnis = 0.00;


// Ethernet Confi          
//================================================================================​=
// IP Configuration in Windows unter Start --> Suche --> "CMD" --> "ipconfig/all"
byte     mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  //MAC Adresse vom EthernetShield
byte      ip[] = { 192, 168, 178, 30};                    //IP  Adresse vom EthernetShield
byte gateway[] = { 192, 168, 178, 1 };                    //Lokale Gateway Adresse
byte  subnet[] = { 255, 255, 255, 0 };                    //Lokale Subnet  Adresse

char server[] = "ofdbgw.home-of-root.de";         //Zugriffsadresse bzw. Mirror
int port = 80;

bool ether = false;
const int ETHselect = 10;
EthernetClient client;

/* keine ahnung warum das da steht, aus altem Code übernommen, kann aber denke ich raus, geht auch ohne
void clearBuffer(char *buf);
void sendData();
int readData();
*/


//================================================================================​=
void setup(){
//================================================================================​=

  pinMode(dataPin, INPUT);    digitalWrite(dataPin, HIGH);                                              
  pinMode(clockPin, INPUT);   digitalWrite(clockPin, HIGH);
  pinMode(ETHselect, OUTPUT);
  pinMode(SDselect, OUTPUT);
  pinMode(53, OUTPUT);                //pin 53 als OUTPUT beim MEGA aktiviert Ethernet SD
  
  currentLine.reserve(256);                                               //keine Ahnung was die zwei machen
  titel.reserve(100);                                                     //übernommen aus anderem Code
  
  SPI.begin();
  lcd.begin(ZEICHEN,ZEILEN);
  Serial.begin(115200); while (!Serial){}
  strip.begin();
  strip.setBrightness(50);

// SD Karten Check und Init
//================================================================================​=
digitalWrite(ETHselect, HIGH);
digitalWrite(SDselect, LOW);
if (!sd.begin(SDselect, SPI_FULL_SPEED)){  // SPI_HALF_SPEED or SPI_FULL_SPEED
     lcd.setCursor(0,2);
     lcd.print("SD N/A // DB OFFLINE");
     db = false;
     errorLED();
   }else{
   if (myFile.open("database.txt", O_READ)){
      while (myFile.read() >= 0){
      lcd.setCursor(0,2);
      lcd.print(" SD OK // DB FOUND ");
      db = true;
      myFile.close();
      }
    }else{
     lcd.setCursor(0,2);
     lcd.print("SD OK // NO DB FOUND");
     db = false;
     errorLED();
    }
  }
   digitalWrite(ETHselect, LOW);
   digitalWrite(SDselect, HIGH);
      
  
if (!Ethernet.begin(mac)) {
     ether = true;
     lcd.setCursor(0,2);
     lcd.print("   Network failed   ");
     errorLED();
     }

  lcd.setCursor(0,0);
  lcd.print("iNET BLU-RAY JUKEBOX");
  lcd.setCursor(0,1);
  lcd.print("IP: ");
  lcd.print(Ethernet.localIP()) ;

  if (ether == false){
  //startup();
  lcd.setCursor(0,3);
  lcd.print(" Scan some BD-Stuff ") ;
  for (int i=0; i<3; i++){
    scanLED();
    delay(100);
  }
  }else{
  lcd.setCursor(0,3);
  lcd.print("!PLS RESTART SYSTEM!");
  while (ether == true){
  resetLED(15);
  }
}
}

//================================================================================​=
void loop(){
//================================================================================​=
if (client.connected()) {
     if (client.available()) {
      char inChar = client.read();                
        currentLine += inChar;
          Serial.print(inChar);
      // if you get a newline, clear the line:
      if (inChar == '\n')
      {
        currentLine = "";
      }
    
     if (currentLine.endsWith("<titel>")){                  
        
        readingTitel = true;
        titel = "";
      }
      if (readingTitel)
      {
        if (inChar != '<' )
        {
          titel += (char)inChar;
        }
        else
        {
          readingTitel = false;
          client.stop();
          titel.remove(0,1);            // erstes Zeichen vom String Löschen
          titel.remove(20);             // maximal 20 Zeichen darstellen rest löschen
        
searcheansd();
if(match == false){
  writesd();
  fach++;
}
    // clear buffer
    clearBuffer(buffer);
    bufferPos = 0;
    match = false;
    okLED();

      Stop = millis();
      Ergebnis = Stop - Start;
      lcd.setCursor(0,0); lcd.print("                    ");
      lcd.setCursor(0,0); lcd.print("Suchzeit: "); lcd.print(Ergebnis/1000);lcd.print(" sec ");
      lcd.setCursor(0,1); lcd.print("                    ");
      lcd.setCursor(0,1); lcd.print(titel);
      lcd.setCursor(10,3); lcd.print("  Stopped ");
      }
     }
    }
   }
  else {
scan();
  }
} // end of loop()

void searcheansd(){
  digitalWrite(ETHselect, HIGH);
  digitalWrite(SDselect, LOW);
  myFile.open("database.txt", O_READ);
  delay(10);
  
while (myFile.available()){
    char eandata = myFile.read();
       Serial.print(eandata);                
        currentLine += eandata;
        // if you get a newline, clear the line:
      if (eandata == '\n')
      {
        currentLine = "";
      }
    
    if (currentLine.endsWith(buffer)){                  
       Serial.print("\nMATCH"); Serial.print(" @ "); Serial.println(buffer); Serial.print("\n");
       Serial.print("\nFach Nr:"); Serial.print(" "); Serial.println(fach); Serial.print("\n");
       match = true;
       break;
      }
     }
  myFile.close();
  digitalWrite(ETHselect, LOW);
  digitalWrite(SDselect, HIGH);
}

void writesd(){
  digitalWrite(ETHselect, HIGH);
  digitalWrite(SDselect, LOW);
myFile.open("database.txt", O_RDWR | O_CREAT | O_AT_END); //Schreibt auf SD Karte und erstellt neue .txt wenn keine vorhanden
    myFile.print(buffer);
    Serial.print(buffer);
    myFile.print(",");
    Serial.print(",");
    myFile.print(fach);
    Serial.print(fach);
    myFile.print(",");
    Serial.print(",");
    myFile.println(titel);
    Serial.println(titel);
myFile.close();
  digitalWrite(ETHselect, LOW);
  digitalWrite(SDselect, HIGH);
}


void sendData(){
client.stop();
    delay(10);
    lcd.setCursor(0,3); lcd.print("Connection to Server");
if (client.connect(server, port)) {
    client.print("GET /searchean/"); client.print(buffer); client.println(" HTTP/1.1");  //Eingabe vom EAN vor der Suche, dann suchen
    client.println("HOST: ofdbgw.home-of-root.de");
    client.println("Connection: close");
    client.println();

    lcd.setCursor(0,2); lcd.print("EAN: "); lcd.print("               "); lcd.setCursor(5,2); lcd.print(buffer); lcd.print("  ");
    lcd.setCursor(10,3); lcd.print("   i.O.   ");
    okLED();
  }
  else {
    // kann keine Verbindung zum Server hergestellt werden:
    lcd.setCursor(10,3); lcd.print(" N.i.O.   ");
    errorLED();
  }
}
void scan(){
  // read data from scanner
  dataValue = readData();
  if (dataValue == SCAN_BREAK) {
     breakActive = 1;
  }

  // check for buffer overflow
  if (bufferPos < BUFFER_LENG) {
    // translate the scan codes to numbers
    // if there is a match, store it to the buffer
    for (int i = 0; i < QUANTITY_CODES; i++) {
      byte temp = SCAN_CODES[i];
      if (temp == dataValue) {
        if (!breakActive == 1) {
          buffer[bufferPos] = CHARACTERS[i];
          bufferPos++;
        } // end of breakActive
      } // end of "valid character"
    } // end of QUANTITY_CODES check
  }

  // code completely scanned
  if (dataValue == SCAN_ENTER) {
      // EAN was scanned
      Start = millis();
      scanLED();
      sendData();
      
     } // end of "SCAN_ENTER" check
  
  // Reset the SCAN_BREAK state if the byte was a normal one
  if (dataValue != SCAN_BREAK) {
    breakActive = 0;
  }
  dataValue = 0;
}
void clearBuffer(char *buf){
  int i=0;
  while(buf[i] != 0) {
     buf[i++] = 0;
  } // end of clear buffer loop
}
int readData(){
  byte val = 0;
  // Skip start state and start bit
  while (digitalRead(clockPin));   // Wait for LOW.
  // clock is high when idle
  while (!digitalRead(clockPin));  // Wait for HIGH.
  while (digitalRead(clockPin));  // Wait for LOW.
  for (int offset = 0; offset < 8; offset++) {
    while (digitalRead(clockPin));         // Wait for LOW
    val |= digitalRead(dataPin) << offset; // Add to byte
    while (!digitalRead(clockPin));        // Wait for HIGH
  }
  // Skipping parity and stop bits down here.
  while (digitalRead(clockPin));           // Wait for LOW.
  while (!digitalRead(clockPin));          // Wait for HIGH.
  while (digitalRead(clockPin));           // Wait for LOW.
  while (!digitalRead(clockPin));          // Wait for HIGH.
  return val;
}
void startup(){
  rainbowCycle(2,5);
  }
void scanLED(){
for (int i=0; i < NUMPIX; i++) {
        strip.setPixelColor(i, 0, 0, 255);
      }
      strip.show();
        delay(50);
          clearstrip();
}
void okLED(){
  for (int i=0; i < NUMPIX; i++) {
        strip.setPixelColor(i, 0, 255, 0);
      }
      strip.show();
        delay(50);
          clearstrip();
}        
void errorLED(){
  for (int d=0; d < 4; d++){
     for (int i=0; i < NUMPIX; i++) {
        strip.setPixelColor(i, 255, 0, 0);
      }
      strip.show();
        delay(50);
          clearstrip();
            delay(250);
       }
}
void resetLED(uint8_t wait){
  int t;
  for (int i = 0; i < NUMPIX; i++) {
    strip.setPixelColor(i, wheel(wc));
    t = i - 1;
    if (t < 0) t = strip.numPixels() - 1;
    strip.setPixelColor(t, strip.Color(0, 0, 0));
    strip.show();
    delay(wait);
  }
   wc+=8;
  if (wc>255) wc=0;
}
void rainbowCycle(uint8_t sets, uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*sets; j++) {
    for(i=0; i< NUMPIX; i++) {
      strip.setPixelColor(i, wheel(((i * 256 / NUMPIX) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
void clearstrip(){
  for (int i=0; i < NUMPIX; i++) {
        strip.setPixelColor(i, 0, 0, 0);    //turn Strip to "BLACK"
      }
      strip.show();
}
uint32_t wheel(byte WheelPos){
  if(WheelPos < 85) //RED
  {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
  else if(WheelPos < 170) //BLUE
  {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Roboter (Projekt) Beginner linux248 1 341 30.11.2016 12:06
Letzter Beitrag: Thie
  Hilfe für Delta Roboter Jonas_91 3 3.087 08.06.2015 10:40
Letzter Beitrag: fraju
  Rasenmäher Roboter mit Arduino Hasborn 67 1 2.019 12.04.2015 17:42
Letzter Beitrag: ohno
  Linienverfolgung mit dem NIBO2 - Roboter Georg 0 1.703 15.01.2014 02:53
Letzter Beitrag: Georg
  Hilfe: Roboter per Funk bedienen Decki 0 2.449 05.08.2013 15:22
Letzter Beitrag: Decki

Gehe zu:


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