Skocz do zawartości

Programowany przez internet otwieracz do garażu


Rekomendowane odpowiedzi

Aktualizacja - napisałem nawet mikro instrukcję obsługi do mojego mikro rozwiązania ;)

/*
 * This solution has 10 slots for codes (0-9) and 10 slots for cards (0-9).
 * Slot 9 is special - in addition to opening door, it is also used
 * as a programming code/card.
 *
 * Commands:
 * L - change code length (resets all codes) - example L5
 * D - delete code - example D1
 * S - set code - example D1202030
 * G - get code - example G1
 * C - get card - example C1
 * A - add card - example A1544370
 * B - delete card - example B1
 * P - ping - example P
 * E - write cards and codes to EEPROM - example E
 * R - read cards and codes from EEPROM - example R
 *
 * Commands respond with OK: [command][some extra data if required] or ERROR: [comand][some extra data] if there was an error:
 * L[length] responds with OK: L[length]
 * D[slot] responds with OK: D[slot]
 * S[slot][code] responds with OK: S[slot][code] or ERROR: S[slot][code] if code length is <> preset length
 * G[slot] responds with OK: G[slot][code at this slot - may be empty]
 * C[slot] responds with OK: C[slot][card # or 0 if no card]
 * A[slot][card #] responds with OK: A[slot][card #] if card # was parsed to long or ERROR: A[slot][card #] if card # was not parsable
 * B[slot] responds with OK: B[slot]
 * P responds with OK: PONG
 * E responds with OK: E: BYTES :[number of bytes written]
 * R responds with OK: R: BYTES :[number of bytes read]
 *
 * Programming via keyboard/card:
 * - press ENT
 * - enter code (slot 9) or scan card (slot 9)
 * - press ENT
 * - enter slot (0-9)
 * - press ENT
 * - enter code or scan card to remember
 * - press ENT
 * Delete code/card via keyboard/card:
 * - press ENT
 * - enter code (slot 9) or scan card (slot 9)
 * - press ENT
 * - enter slot (0-9)
 * - press ENT
 * - press ESC
 */
Odnośnik do komentarza
Udostępnij na innych stronach

Zazdraszczam umiejętności programowania... no i taniej elektroniki w USA... u nas jakby ktoś chciał nakupować zabawek na start, to z 500 PLN nie jego...

Cała elektronika przyszła z Chin :) koszty są naprawdę niewielkie - Arduino z kabelkiem $5, płytka przekaźników $4, przetwornik 12V -> 5V 3A $4, ta klawiatura była najdroższa - $17. No i oczywiście Pi - z obudowa, zasilaczem (bezużytecznym), modułem WiFi i radiatorami na scalaki zapłaciłem chyba $45 albo coś koło tego. Ale jak na razie Pi jest mało przydatne a docelowo pewnie użyje Pi model A+ za $24.

A napisanie tego programu to żadna sztuka, dzisiaj wkleję źrodła dla pokazania ze to nic strasznego...

Odnośnik do komentarza
Udostępnij na innych stronach

Próbowałem Bascoma, C, C++, coś tam liznąłem PHP, HTML i CSS - tyle, co potrzebowałem do danego zadania, więc raczej niewiele.Chciałbym się rozwinąć, ale jakoś tak w życiu wychodzi, że czasu brakuje. Może, jak w końcu skończę remont domu i się wprowadzę na swoje, to poświęcę czas na hobby, a pomysłów jest sporo :) Mam paru kolegów, którzy kodzą ostro - krew mnie zalewa, że ja kminię coś pół dnia, a któryś z nich podejdzie, ponapierdziela kodem i voilla :)

Odnośnik do komentarza
Udostępnij na innych stronach

Obiecany kod, to nadal nie skończone rozwiązanie (nie mam jeszcze dopracowanego otwierania i zamykania drzwi garażowych oraz obsługi czujników odległości);

#include <Wiegand.h>
#include <EEPROM.h>

WIEGAND wg;

// keyboard support
String  code = "";
byte index = 0;
byte maxIndex = 6;

// Serial support
String inputString = "";
boolean stringComplete = false;

// card and code storage
String codes[10] = { String( " " ), String( "" ),  String( "" ), String( "" ), String( "" ), String( "" ), String( "" ), String( "" ), String( "" ), String( "" ) };
unsigned long cards[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // ten slots for cards

// programming variables
byte programmingMode = 0;
byte programmingSlot = 0;
String enteredProgrammingCode = "";
String enteredNewCode = "";
unsigned long enteredProgrammingCard = 0;
unsigned long enteredNewCard = 0;

// persistence
byte serialized[141];

/*
 * This solution has 10 slots for codes (0-9) and 10 slots for cards (0-9).
 * Slot 9 is special - in addition to opening door, it is also used
 * as a programming code/card.
 *
 * Serial Port Commands:
 * L - change code length (resets all codes) - example L5
 * D - delete code - example D1
 * S - set code - example D1202030
 * G - get code - example G1
 * C - get card - example C1
 * A - add card - example A1544370
 * B - delete card - example B1
 * P - ping - example P
 * E - write cards and codes to EEPROM - example E
 * R - read cards and codes from EEPROM - example R
 *
 * Commands respond with OK: [command][some extra data if required] or ERROR: [comand][some extra data] if there was an error:
 * L[length] responds with OK: L[length]
 * D[slot] responds with OK: D[slot]
 * S[slot][code] responds with OK: S[slot][code] or ERROR: S[slot][code] if code length is <> preset length
 * G[slot] responds with OK: G[slot][code at this slot - may be empty]
 * C[slot] responds with OK: C[slot][card # or 0 if no card]
 * A[slot][card #] responds with OK: A[slot][card #] if card # was parsed to long or ERROR: A[slot][card #] if card # was not parsable
 * B[slot] responds with OK: B[slot]
 * P responds with OK: PONG
 * E responds with OK: E: BYTES :[number of bytes written]
 * R responds with OK: R: BYTES :[number of bytes read]
 *
 * Programming via keyboard/card:
 * - press ENT
 * - enter code (slot 9) or scan card (slot 9)
 * - press ENT
 * - enter slot (0-9)
 * - press ENT
 * - enter code or scan card to remember
 * - press ENT
 * Delete code/card via keyboard/card:
 * - press ENT
 * - enter code (slot 9) or scan card (slot 9)
 * - press ENT
 * - enter slot (0-9)
 * - press ENT
 * - press ESC
 */

void setup() {
  inputString.reserve(20);
  resetLength();
  for ( byte i = 0; i < 141; i++ )
  {
    serialized[i] = 0;
  }
  Serial.begin(9600);
  wg.begin();
  pinMode(4, OUTPUT); // keypad LED
  pinMode(5, OUTPUT); // keypad annnoying speaker
  pinMode(6, OUTPUT); // garage door opener
  pinMode(7, OUTPUT); // garage door light
  pinMode(8, OUTPUT);  
  pinMode(9, OUTPUT);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  Serial.println( "STARTED:");
}

void loop() {

  if (wg.available())
  {
    unsigned long input = wg.getCode();
    if ( input == 10 )
    {
      processESC();
    }
    else if ( input == 11 )
    {
      processENT();
    }
    else if ( input >= 0 && input < 10 )
    {
      processKey(input);
    }
    else
    {
      processCard(input);
    }
  }

  if ( stringComplete )
  {
    processSerial();
  }
}


// handles asynchronous serial input
void serialEvent() 
{
  while (Serial.available()) 
  {
    // get the new byte:
    char inChar = (char)Serial.read();

    if (inChar == '\n') 
    {
      stringComplete = true;
    }
    else
    {
      if ( inputString.length() < 20 )
      {
        inputString += inChar;
      }
    }
  }
}

// make error sound
void beepError()
{
  for ( byte i = 0; i < 3; i++ )
  {
    digitalWrite(5, LOW);
    delay(100);
    digitalWrite(5, HIGH);
    delay(100);
    digitalWrite(5, LOW);
    delay(50);
    digitalWrite(5, HIGH);
    delay(50);
    digitalWrite(5, LOW);
    delay(50);
    digitalWrite(5, HIGH);
    delay(50);
  }
}

// make OK sound and blink green
void beepOk()
{
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  delay(100);
  digitalWrite(5, HIGH);
  delay(500);
  digitalWrite(4, HIGH);
}

// make escape key sound
void beepEscape()
{
  for ( byte i = 0; i < 3 ; i ++) {
    digitalWrite(5, LOW);
    delay(50);
    digitalWrite(5, HIGH);
    delay(50);
  }
}

// resets everything and reports beeping error
void resetError()
{
  beepError();
  reset();
}

// resets everything (programming mode, keyboard input)
void reset()
{
  resetInput();
  programmingMode = 0;
  enteredNewCode = "";
  enteredProgrammingCode = "";
  enteredProgrammingCard = 0;
  enteredNewCard = 0;
}

// resets keyboard input
void resetInput()
{
  index = 0;
  code = "";
}


// call after maxLength is changed to adjust memory storage
void resetLength()
{
  index = 0;
  code = "";
  code.reserve(maxIndex);
  for ( byte i = 0; i < 10; i++ )
  {
    codes[i] = "";
    codes[i].reserve( maxIndex );
  }
  enteredProgrammingCode = "";
  enteredProgrammingCode.reserve(maxIndex);
  enteredNewCode = "";
  enteredNewCode.reserve(maxIndex);
}


byte saveToEEPROM()
{
  byte eIdx = 0;
  serialized[ eIdx++ ] = maxIndex;
  for ( byte i = 0; i < 10; i++ )
  {
    if ( codes[i] == "" )
    {
      serialized[ eIdx++ ] = 0;
    }
    else
    {
      for ( byte j = 0; j < maxIndex; j++ )
      {
        serialized[ eIdx++ ] = byte( codes[i].charAt(j) );
      }
    }
  }
  for ( byte i = 0; i < 10; i++ )
  {
    serialized[ eIdx++ ] = (byte)cards[i];
    serialized[ eIdx++ ] = (byte) (cards[i] >> 8 );
    serialized[ eIdx++ ] = (byte) (cards[i] >> 16 );
    serialized[ eIdx++ ] = (byte) (cards[i] >> 24 );
  }
  EEPROM.put( 0, serialized );
  return eIdx;
}

byte readFromEEPROM()
{
  for ( byte i = 0; i < 141; i++ )
  {
    serialized[i] = 0;
  }
  EEPROM.get( 0, serialized );

  byte eIdx = 0;
  maxIndex = serialized[ eIdx++ ];
  resetLength();

  for ( byte i = 0; i < 10; i++ )
  {
    byte eval = serialized[ eIdx++ ];
    if ( eval == 0 )
    {
      codes[i] = "";
    }
    else
    {
      String c = String( (char)eval );
      for ( byte j = 1; j < maxIndex; j++ )
      {
        c += (char) serialized[ eIdx++ ];
      }
      codes[i] = c;
    }
  }
  for ( byte i = 0; i < 10; i++ )
  {
    byte c0 = serialized[ eIdx++ ];
    byte c1 = serialized[ eIdx++ ];
    byte c2 = serialized[ eIdx++ ];
    byte c3 = serialized[ eIdx++ ];
    cards[i] = (unsigned long)(c3 << 24) | (unsigned long)(c2 << 16) | (unsigned long)(c1 << 8) | (unsigned long)c0 ;
  }
  return eIdx;
}

void processESC()
{
  if ( programmingMode == 4 )
  {
    if ( enteredProgrammingCard > 0 )
    {
      cards[programmingSlot] = 0;
      Serial.print( "OK: CARD REMOVED FROM SLOT " );
      Serial.println( programmingSlot );
    }
    else
    {
      codes[programmingSlot] = "";
      Serial.print( "OK: CODE REMOVED FROM SLOT " );
      Serial.println( programmingSlot );
    }
    beepOk();
    beepOk();
    beepEscape();
    beepEscape();
    reset();
  }
  else
  {
    beepEscape();
    reset();
  }
}

void processENT()
{
  if ( programmingMode == 0 )
  {
    Serial.println( "OK: PROGRAMMING MODE 1" );
    programmingMode = 1;
    programmingSlot = 0;
    resetInput();
  }
  else if ( programmingMode == 1 )
  {
    Serial.println( "ERROR: DOUBLE ENTER IN PROGRAMMING MODE 1" );
    resetError();
  }
  else if ( programmingMode == 2 )
  {
    if ( enteredProgrammingCode == codes[9] )
    {
      Serial.println( "OK: PROGRAMMING MODE 3" );
      beepOk();
      beepOk();
      programmingMode = 3;
      resetInput();
    }
    else
    {
      Serial.print( "ERROR: INVALID PROGRAMMING CODE: " );
      Serial.println( enteredProgrammingCode );
      resetError();
    }
  }
  else if ( programmingMode == 3 && index ==  1 )
  {
    programmingSlot = code.charAt(0) - '0';
    if ( programmingSlot >= 0 && programmingSlot < 10 )
    {
      Serial.println( "OK: PROGRAMMING MODE 4" );
      programmingMode = 4;
      beepOk();
      resetInput();
    }
    else
    {
      Serial.print( "ERROR: INVALID PROGRAMMING SLOT: " );
      Serial.println( code );
      resetError();
    }
  }
  else if ( programmingMode == 4 )
  {
    Serial.println( "ERROR: DOUBLE ENTER IN PROGRAMMING MODE 4" );
    resetError();
  }
  else if ( programmingMode == 5 )
  {
    Serial.print( "OK: CODE: " );
    Serial.print( enteredNewCode );
    Serial.print( " PROGRAMMED INTO SLOT " );
    Serial.println( programmingSlot );
    codes[programmingSlot] = enteredNewCode;
    beepOk();
    beepOk();
    beepOk();
    beepOk();
    reset();
  }
  else if ( programmingMode == 6 )
  {
    if ( enteredProgrammingCard == cards[9] && enteredProgrammingCard > 0)
    {
      Serial.println( "OK: PROGRAMMING MODE 3" );
      beepOk();
      beepOk();
      programmingMode = 3;
      resetInput();
    }
    else
    {
      Serial.print( "ERROR: INVALID PROGRAMMING CARD: " );
      Serial.println( enteredProgrammingCard );
      resetError();
    }
  }
  else if ( programmingMode == 7  && enteredNewCard > 0)
  {
    Serial.print( "OK: CARD: " );
    Serial.print( enteredNewCard );
    Serial.print( " PROGRAMMED INTO SLOT " );
    Serial.println( programmingSlot );
    cards[programmingSlot] = enteredNewCard;
    beepOk();
    beepOk();
    beepOk();
    beepOk();
    reset();
  }
  else
  {
    Serial.println( "ERROR: UNKNOWN PROGRAMMING MODE" );
    resetError();
  }
}

void processKey(unsigned long input)
{
  code += (char)( '0' + input );
  index++;
  if ( index == maxIndex )
  {
    if ( programmingMode == 1 )
    {
      Serial.println( "OK: PROGRAMMING MODE 2" );
      programmingMode = 2;
      enteredProgrammingCode = code;
      resetInput();
    }
    else if ( programmingMode == 4 )
    {
      Serial.println( "OK: PROGRAMMING MODE 5" );
      programmingMode = 5;
      enteredNewCode = code;
      resetInput();
    }
    else if ( programmingMode != 0 )
    {
      Serial.println( "ERROR: CODE ENTRY IN UNKNOWN PROGRAMMING MODE" );
      resetError();
    }
    else if ( programmingMode == 0 )
    {
      boolean correctCode = false;
      for ( byte i = 0; i < 10; i++ )
      {
        if ( code == codes[i] )
        {
          correctCode = true;
          break;
        }
      }
      if ( correctCode )
      {
        Serial.print("CODE: ");
        Serial.println(code);
        beepOk();
        resetInput();
        programmingMode = 0;
        triggerDoor();

      }
      else
      {
        Serial.print("INV: ");
        Serial.println(code);
        resetError();
      }
    }
  }
  else if (index > maxIndex )
  {
    Serial.println( "ERROR: TOO MANY CHARS" );
    resetError();
  }
}

void processCard(unsigned long input)
{
  if ( programmingMode == 1 )
  {
    Serial.println( "OK: PROGRAMMING MODE 6" );
    programmingMode = 6;
    enteredProgrammingCard = input;
    resetInput();
  }
  else if ( programmingMode == 4 )
  {
    Serial.println( "OK: PROGRAMMING MODE 7" );
    programmingMode = 7;
    enteredNewCard = input;
    resetInput();
  }
  else if ( programmingMode != 0 )
  {
    Serial.println( "ERROR: CARD ENTRY IN UNKNOWN PROGRAMMING MODE" );
    resetError();
  }
  else if ( programmingMode == 0 )
  {
    boolean correctCode = false;
    for ( byte i = 0; i < 10; i++ )
    {
      if ( input == cards[i] )
      {
        correctCode = true;
        break;
      }
    }
    if ( correctCode )
    {
      Serial.print("CARD: ");
      Serial.println(input);
      beepOk();
      resetInput();
      programmingMode = 0;
      triggerDoor();
    }
    else
    {
      Serial.print("INVCARD: ");
      Serial.println(input);
      resetError();
    }
  }
}

void processSerial()
{
  digitalWrite(4, LOW);
  boolean processed = false;
  if ( inputString.length() > 0 )
  {
    if ( inputString.charAt( 0 ) == 'L' && inputString.length() == 2 )
    {
      maxIndex = inputString.charAt( 1 ) - '0';
      if ( maxIndex > 0 && maxIndex < 10 )
      {
        resetLength();
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'D' && inputString.length() == 2 )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        codes[codeIndex] =  "" ;
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'S' && inputString.length() == 2 + maxIndex )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        codes[codeIndex] =  inputString.substring(2);
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'G' && inputString.length() == 2 )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        inputString += codes[codeIndex] ;
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'C' && inputString.length() == 2 )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        inputString += cards[codeIndex] ;
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'A'  )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        cards[codeIndex] = inputString.substring(2).toInt();
        if ( cards[codeIndex] > 0 )
        {
          inputString = String( "A" ) + String( inputString.charAt( 1 ) ) + String( cards[codeIndex], DEC );
          processed = true;
        }
      }
    }
    else if ( inputString.charAt( 0 ) == 'B' && inputString.length() == 2 )
    {
      int codeIndex = inputString.charAt( 1 ) - '0';
      if ( codeIndex >= 0 && codeIndex < 10 )
      {
        cards[codeIndex] =  0 ;
        processed = true;
      }
    }
    else if ( inputString.charAt( 0 ) == 'P' && inputString.length() == 1 )
    {
      inputString += "ONG" ;
      processed = true;
    }
    else if ( inputString.charAt( 0 ) == 'E' && inputString.length() == 1 )
    {
      byte eIdx = saveToEEPROM();
      inputString += ": BYTES :" + String( eIdx, DEC) ;
      processed = true;
    }
    else if ( inputString.charAt( 0 ) == 'R' && inputString.length() == 1 )
    {
      byte eIdx = readFromEEPROM();
      inputString += ": BYTES :" + String( eIdx, DEC) ;
      processed = true;
    }

  }

  if ( processed )
  {
    Serial.print( "OK: " );
    Serial.println(inputString);
  }
  else
  {
    Serial.print( "ERROR: " );
    Serial.println(inputString);
  }
  // clear the string:
  delay(500);
  digitalWrite(4, HIGH);
  inputString = "";
  stringComplete = false;
}

void triggerDoor()
{
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  delay( 500 );
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

Odnośnik do komentarza
Udostępnij na innych stronach

Dziś był dzień prób integracji. Najpierw nic mi nie działało. Okazało sie ze zasilacz 5V jest zepsuty i daje 2.5V. Zmieniłem. Potem zaczęło trochę działać ale głośnik dziwnie szumiał. Dołożyłem kondensatory na 12V, 5V i 3.3V. Szumienie ustąpiło. Potem Pi nie była w stanie ruszac przekaźnikami przez scalak zmieniający poziomy logiczne. Okazało sie ze to zimny lut. Potem okazało sie ze Pi nie ma wyprowadzonego PINu 'reset'. Dolutowałem. Na chwile obecna zarówno Arduino jak i Pi mogą sterować przekaźnikami i Arduino gada przez serial do Pi. Niestety w odwrotna stronę nie idzie. Podejrzewam ze brakuje opornikow podnoszących - jutro je wlutuje.

Całe rozwiazanie w tej chwili używa Pi 2 Model B, ale planuje przejść na Pi A+, dlatego chce gadać przez PINy a nie USB (usb bedzie potrzebne do WiFi).

post-133705-0-17311300-1438380213_thumb.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Aktualizacja negatywna. Od kilku dni walczę próbując zmusić Pi do komunikacji z Arduino. O ile w jedną stronę (Arduino -> Pi) idzie znakomicie, o tyle w drugą za nic nie chce iść. Nie wiem za bardzo dlaczego. Po drodze jest TXB 0104 - próbowałem już wszystko - kondensatory na liniach doprowadzających napięcie, oporniki podciągające i opuszczające po obu stronach. Nic nie pomaga. Więc się poddałem i zakupiłem takie coś:

http://www.amazon.com/gp/product/B00XVZ78XI

Mam nadzieję że to będzie działało i będą gadały ze sobą...

 

P.S. Udało mi się na eBay;u za $5 kupić Pi model A+ ;):) :))

Odnośnik do komentarza
Udostępnij na innych stronach

Dziś z innej beczki - jako że czekam na części do Pi, to zacząłem się bawić ESP 8266.

 

 

AT+GMR

00200.9.5(b1)
compiled @ Dec 25 2014 21:40:28
AI-THINKER Dec 25 2014
 
OK
AT+CWMODE?
+CWMODE:2
 
OK
AT+CWMODE=3
 
OK
AT+CWLAP
+CWLAP:(3,"Marek's Guest Network",-29,"8a:bc:35:37:a1:10",1)
+CWLAP:(3,"1368TipperaryDrive",-29,"88:1f:a1:37:35:bc",1)
+CWLAP:(3,"1368TipperaryDrive",-83,"00:25:4b:0a:2b:df",1)
+CWLAP:(4,"tomatoplant",-90,"ec:1a:59:58:c3:36",6)
+CWLAP:(3,"NETGEAR88",-91,"20:4e:7f:9c:c1:10",7)
+CWLAP:(3,"Batson",-93,"c4:04:15:57:dd:93",11)
+CWLAP:(3,"Savinon",-91,"14:cf:e2:82:96:b0",11)
 
OK
AT+CIFSR
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"1a:fe:34:f9:35:4a"
+CIFSR:STAIP,"192.168.1.75"
+CIFSR:STAMAC,"18:fe:34:f9:35:4a"
 
OK
AT+CIPSTART="TCP","api.thingspeak.com", 80
CONNECT
 
OK
AT+CIPSEND=70
> GET /update?api_key=QNI517W61UOC40KF&field1=12&field2=19&field3=94   
SEND OK
 
+IPD,3:413
OK
CLOSED
 
 
Edycja - ten scalak jest N I E S A M O W I T Y ! ! !
 

 

connecting to www.adafruit.com

Requesting URL: /testwifi/index.html
HTTP/1.1 200 OK
Date: Tue, 04 Aug 2015 20:36:25 GMT
Server: Apache
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Authorization, Referer, User-Agent
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000
Accept-Ranges: bytes
X-Mod-Pagespeed: 1.9.32.3-4448
Vary: Accept-Encoding
Cache-Control: max-age=0, no-cache
Content-Length: 74
Connection: close
Content-Type: text/html
 
This is a test of the CC3000 module!
If you can read this, its working :)
 
closing connection
 

 

Tak, kilka linii kodu i można z niego zrobić mikro kontroler z dostępem do internetu. Hmm, tyle ciekawych pomysłów! Np. sterownik żaluzji...

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra, następna aktualizacja - po zamontowaniu tej płytki konwertującej napięcia wszystko działa jak malinki ;) Arduino i Pi gadają ze sobą bez żadnych problemów. Wygląda na to że rozwiązanie jest prawie gotowe. Teraz tylko przydało by się jeszcze zrobić oprogramowanie do watchdog'ów + REST interface do kontrolowania tego przez internet. 

Odnośnik do komentarza
Udostępnij na innych stronach

Zazdraszczam umiejętności programowania... no i taniej elektroniki w USA... u nas jakby ktoś chciał nakupować zabawek na start, to z 500 PLN nie jego...

 

Ja kupuję te zabawki na aliexpress. Ceny takie, jak Marek podał i to bez kosztów przesyłki. Tylko przy większych (pewnie grubo powyżej 100zł) zakupach jednorazowych mogą dowalić cło. Ale przy mniejszych (dotąd zamawiałem kilkanaście razu) nie ma problemu. Czas dotarcia przesyłki od 8 do 30 dni.

Odnośnik do komentarza
Udostępnij na innych stronach

Edycja - ten scalak jest N I E S A M O W I T Y ! ! !

 

Używam ESP8266 w domu do komunikacji pomiędzy czujnikami pogodowymi i alarmem na arduino. Są niezawodne, maleńkie i całkiem mocne (co z kolei generuje wymóg dobrego zasilania). Niestety z arduino gada przez konwerter poziomów, ale nie jest źle. Tobie polecam jednak przy docelowych zastosowaniach użycie firmware NodeMCU - bardziej samodzielny i wymagający mniej działań po stronie arduino/rPi. Na trzy moduły wifi na dwóch mam właśnie nocemcu, a w jednym jadę na AT. Żeby pogadać z nimi w arduino w przypadku AT trzeba sporo kodu, a w przypadku nodemcu sprawa się znacznie upraszcza. Poza tym część funkcji można przypisać modułowi bezpośrednio (wysyłanie i odbieranie danych z www, odczyt stanów wejść GPIO modułu wifi). Zaletą AT jest to, że z arduino gada mi na 115200, a przy nodemcu na 9600. Jeśli zaś chodzi o dobór wersji esp, to w moim przypadku lepiej działa ESP12 niż ESP01. 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli nie zmieniasz za często konfiguracji wifi tam, gdzie ma ten moduł pracować, to polecam ustawienie konfiguracji wifi właśnie w pliku init w nodemcu. Można tam również zaprogramować akcje na wypadek rozłączenia z wifi itp. Nie wiem jak jest z rPi, ale w adruino z jednym serialem nie powinno się wgrywać programów z podłączonym modułem esp. To samo co na arduino leci wówczas na wifi i może spowodować różne nieprzewidziane sytuacje. Tam, gdzie projektowałem sobie PCB do wykorzystania esp zastosowałem rozłączalne zworki, żeby szybko i wygodnie rozłączać linię komunikacyjną.

Odnośnik do komentarza
Udostępnij na innych stronach

Dostałem dzis w końcu z Chin te ultradźwiękowe czujniki odległości. Sa genialne. Dzialaja idealnie - od mniej-wiecej 3 cm do jakichś 3, 3.5 metra. Obsługa banalna, podłącza sie cztery kabelki i gotowe. Z Arduino dzialaja az miło. W planach mam zainstalowanie ich na suficie - jeden tak by zasłaniała go brama jak jest całkiem otworzona, a drugi tak by zasłaniała go brama jak jest troche otwarta. W ten sposob bede wiedział czy jest całkiem otwarta, cześciowo otwarta lub zupełnie zamknięta. Dodałem obsługę tego do kodu Arduino, teraz największym wyzwaniem jest zapakowanie wszystkiego w pudełka, zrobienie kabelków (bede używał do łączenia gniazdek i wtyków telefonicznych bo sa najtansze) i montaż tego na miejscu.

Odnośnik do komentarza
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Używając tego serwisu, wyrażasz zgodnę na naszą Polityka prywatności oraz Warunki użytkowania.