Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino + pomiar temperatury z rejestracją + rejestrator czasu pracy + załączan

jaceklesniowski 15 Lip 2014 15:20 8739 5
  • Ponieważ ostatnio zostałem posądzony że nic nie wnoszę do forum tylko a, tylko korzystam więc „pochwale się moim projektem” chociaż pochwalić to w tym przypadku za duże słowo bo nie ma czym, gdyż projekt jest w wersji roboczej, ale DZIAŁA był testowany w firmie przez 3 miesiące i wszystko jest ok więc prezentuje.

    To jest moja pierwsza przygoda z mikrokontrolerami więc proszę o konstruktywne uwagi, gdyż jestem programistą php a nie elektronikiem.

    Zaczęło się od tego że chciałem rejestrować temperaturę na piecu i suszarni za pomocą Funduino Mega 2560 (klon arduino) + ethernet shieled W5100 i czujników Dallas DS18B20 , pomiary zapisywać do bazy mysql a później obserwować zmiany na wykresie i to się udało.

    plik screen_ekranu_wykres_temeratury.jpg
    Arduino + pomiar temperatury z rejestracją + rejestrator czasu pracy + załączan

    Zachęcony dodałem rejestrator czasu pracy za pomocą kart rfid jako czytnik użyłem moduł RFID MF RC522. Oczywiście każde wejście i wyjście pracownika jest zapisywane w bazie mysql. Na podstawie wpisów tworzę sobie zestawienie czasu pracy.

    Pracownik wybiera opcję za pomocą 2 przycisków wyjście lub wyjście i przykłada karę.


    Jeszcze postanowiłem dołożyć do tego sterowanie światłem na parkingu i w dwóch pomieszczeniach w firmie, poza tym jak zapomniałem pilota do bramy to dołożyłem jeszcze sterowanie braną :) z przeglądarki internetowej.

    Arduino + pomiar temperatury z rejestracją + rejestrator czasu pracy + załączan
    plik screen_ekranu_sterowanie_swiatlem.jpg

    Koszty:
    Wszytko kupiłem na allegro.

    Funduino Mega 2560 (klon arduino) - 80 zł
    ethernet shieled W5100 - 35 zł
    Dallas DS18B20 - 5 zł sztuka
    RFID MF RC522 - 30 zł
    Wyświetlacz LCD 16x2 HD44780 – 12 zł
    do tego dwa przyciski i kabelki
    koszty naprawę niewielkie w stosunku do tego co uzyskałem.
    Poniżej przeze tuje program i tu proszę o wyrozumiałość. To jest mój pierwszy projekt i pierwszy program w C. Wiem że składnia jest nie ładna itd. itp. ale dzięki krytyce na pewno się dużo nauczę.
    Jeśli będzie ktoś chciał coś podobnego zrobić zawsze jakiś fragment kodu może się przydać.

    Code:


    #include <SPI.h>
    #include <Ethernet.h>
    #include <Wire.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>
    #include <MFRC522.h>
    LiquidCrystal lcd(22, 24, 32, 30, 28, 26);
    // 22 - RS
    // 23 - E


    #define ONE_WIRE_BUS 9
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    byte ip[] = { 192, 168, 1, 30 };
    byte gateway[] = { 192, 168, 1, 1 };
    byte subnet[] = { 255, 255, 255, 0 };
    char server_d[] = "www.xxxxxxxx.com";   

    EthernetServer server(80); //arduino server port
    EthernetClient client;

    String readString;
    #define PIEZO_PIN 6
    #define SS_PIN 53
    #define RST_PIN 48
    MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
    String id_karty;;
    String id_karty_spr;
    String k;
    int zmie = 3;
    int zmie_spr =3 ;
    int errorlog =0 ;

    //pierwsze opoznienie
    unsigned long temo_time = millis() + 300000;
    int resetPin = 7;


    void setup(){
      lcd.begin(16, 2);
      lcd.setCursor(0,1);
      lcd.print("wybierz opcje");
      pinMode(5, OUTPUT);
      Ethernet.begin(mac, ip, gateway, subnet);
      server.begin();
      Serial.begin(9600);
       mfrc522.PCD_Init();   
      sensors.begin();
      pinMode(36, OUTPUT);
      pinMode(38, OUTPUT);
      pinMode(40, OUTPUT);
      pinMode(42, OUTPUT);
      pinMode(44, OUTPUT);
      pinMode(46, OUTPUT);
     
      id_karty_spr="1" ;
      id_karty="0" ; 

     
    pinMode(3, INPUT);     //pracuje jako wejscie
    //digitalWrite(3, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)

    pinMode(4, INPUT);     //pracuje jako wejscie
    //digitalWrite(4, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)

    digitalWrite(36, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
    digitalWrite(38, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
    digitalWrite(40, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
    digitalWrite(42, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
    digitalWrite(44, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)
    digitalWrite(46, HIGH); //spoczynkowy stan wysoki (rezystory podciagajace wlaczone)

    digitalWrite(resetPin, HIGH);
    pinMode(resetPin, OUTPUT);     
     
    }

    void loop()
    {
       unsigned long time = millis();
        if (time >= temo_time) {
         Serial.println("Zapis temeratury"); 
        mysql_temp();   
        temo_time = time + 300000 ; // co 5 min dodawaj temp
      }

      int przycisk = digitalRead(3); //odczytujemy stan przycisku
        if(przycisk == HIGH) {           //jesli przycisk nie jest wcisniety
          lcd.setCursor(0,1);
          lcd.print("rozpoczecie  ");
          zmie = 1; //odczytujemy stan przycisku
      };
     
      int przycisk2 = digitalRead(4); //odczytujemy stan przycisku
        if(przycisk2 == HIGH) {           //jesli przycisk nie jest wcisniety
          lcd.setCursor(0,1);
          lcd.print("zakonczenie  ");
         zmie = 2;
      };

        //lcd.clear();
        sensors.requestTemperatures();
        lcd.setCursor(0,0);
        lcd.print(sensors.getTempCByIndex(0));;
        lcd.write(0xDF);
        lcd.write('C');
        lcd.write('  ');
        lcd.print(sensors.getTempCByIndex(1));;
        lcd.write(0xDF);
        lcd.write('C');
         
      id_karty = ""; 
      if (mfrc522.PICC_IsNewCardPresent()){   
            mfrc522.PICC_ReadCardSerial();   
            for (byte i = 0; i < mfrc522.uid.size; i++) { id_karty += mfrc522.uid.uidByte[i], HEX;}
       if(zmie != 3) {       
                Serial.println(id_karty);
                if(id_karty == "2295761116")    {gong();mysql_kar();  k="Kowalski     .";  zmie_spr=zmie;  zmie=3;  } else{};
                if(id_karty == "14822211926")   {gong();mysql_kar();  k="Nowak        .";  zmie_spr=zmie;  zmie=3;  } else{}; 
                 // tutaj kolejni pracownicy
                 lcd.setCursor(0,1);
                 lcd.print(k);
                 delay(1000);
                 lcd.setCursor(0,1);
                   if(zmie == 3 ) {lcd.print("wybierz opcje  "); }
       }   
    }

    // ---- uruchamianie serwera

      EthernetClient client = server.available();
      if (client) {
        boolean currentLineIsBlank = true;
          while (client.connected()) {
               if (client.available()) {
                char c = client.read();
              if (readString.length() < 100) {readString += c; }
              if (c == '\n' && currentLineIsBlank) {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/html");
              client.println("Connnection: close");
              client.println();
              client.println("<!DOCTYPE HTML>");
              client.println("<html>");

     client.println("<body bgcolor='#c0c0c0'>");
    client.println("<style type='text/css'>"); 
    client.println("#tabela td { border: 0 px solid black; padding: 5px; border-spacing: 5px; font-weight: bold; text-align: center}"); 
    client.println("#ON {background-color: green; vertical-align: top; font-weight: bold; width: 100px;}"); 
    client.println("#OFF {background-color: red ; vertical-align: top; font-weight: bold; width: 100px;}"); 
    client.println("#n{background-color: #808080;}"); 
    client.println("a {text-decoration: none;}"); 
    client.println("a:link,a:active,a:visited { color : black; }"); 
    client.println("</style>"); 
         
             
               client.println("<br />");   
               client.print(" temperatura");   
               client.println("<br />");   
               sensors.requestTemperatures();
               client.println("Czujnik-1: ");
               client.println(sensors.getTempCByIndex(0));
               client.println("<br />"); 
               client.println("Czujnik-2: ");
               client.println(sensors.getTempCByIndex(1));
               client.println("<br />"); 
               client.println("<hr />");
               client.println("<br />");
             
     client.println("<table id='tabela' style='border-spacing: 10px'> "); 
     client.println("<tr id='n'><td colspan='3'>DOM</td></tr>"); 
     
     client.println("<tr> <td  >Swiatlo Parking </td><td id='ON'>"); 
     client.println("<a href=\"/?LED44_ON\"\">ON</a>");
     client.println("</td><td id='OFF' >"); 
     client.println("<a href=\"/?LED44_OFF\"\">OFF</a>");
     client.println("</td></tr>");         

     client.println("<tr> <td  >Swiatlo front </td><td id='ON'>"); 
     client.println("<a href=\"/?LED46_ON\"\">ON</a>");
     client.println("</td><td id='OFF' >"); 
     client.println("<a href=\"/?LED46_OFF\"\">OFF</a>");
     client.println("</td></tr>");         
             
     client.println("<tr> <td  >Dom brama </td><td id='ON'>"); 
     client.println("<a href=\"/?LED40_ON\"\"><---></a>");
     client.println("</td>"); 
     client.println("</td></tr> </table> <br>");               

       
     client.println("<table id='tabela' style='border-spacing: 10px'> "); 
     client.println("<tr id='n'><td colspan='3'> FIRMA </td></tr>"); 
     
     client.println("<tr> <td  >Swiatlo piec </td><td id='ON'>"); 
     client.println("<a href=\"/?LED38_ON\"\">ON</a>");
     client.println("</td><td id='OFF' >"); 
     client.println("<a href=\"/?LED38_OFF\"\">OFF</a>");
     client.println("</td></tr>");       

           
     client.println("<tr> <td  >Swiatlo malarnia </td><td id='ON'>"); 
     client.println("<a href=\"/?LED36_ON\"\">ON</a>");
     client.println("</td><td id='OFF' >"); 
     client.println("<a href=\"/?LED36_OFF\"\">OFF</a>");
     client.println("</td></tr> </table> <br>");     
       
             
              /*--------( End Sensor Read )--------------------------------*/
              client.println("</html>");
              break; }
               if (c == '\n') { currentLineIsBlank = true;}  else if (c != '\r') { currentLineIsBlank = false;} }
                 } // koniec połączenia internetowego
                 
                 
                 delay(1);
                 client.stop();
                 
          int op360 = readString.indexOf("36_OFF");
          int op361 = readString.indexOf("36_ON");
          int op381 = readString.indexOf("38_OFF");
          int op380 = readString.indexOf("38_ON");
          int op400 = readString.indexOf("40_OFF");
          int op401 = readString.indexOf("40_ON");
         
          int op440 = readString.indexOf("44_OFF");
          int op441 = readString.indexOf("44_ON");
         
          int op460 = readString.indexOf("46_OFF");
          int op461 = readString.indexOf("46_ON");
         
           
              if(op361 > 0) { digitalWrite(36, LOW); } else{};
              if(op360 > 0) { digitalWrite(36, HIGH); } else{};
              if(op380 > 0) { digitalWrite(38, LOW); } else{};
              if(op381 > 0) { digitalWrite(38, HIGH); } else{};
              if(op400 > 0) { digitalWrite(40, HIGH); } else{};
              if(op401 > 0) { digitalWrite(40, LOW); delay(500);  digitalWrite(40, HIGH); } else{};         
     
              if(op441 > 0) { digitalWrite(44, LOW); } else{};
              if(op440 > 0) { digitalWrite(44, HIGH); } else{};
             
              if(op461 > 0) { digitalWrite(46, LOW); } else{};
              if(op460 > 0) { digitalWrite(46, HIGH); } else{};
     
              readString="";
      }
     
     
    if(errorlog == 1) {
      lcd.setCursor(0,1);
      lcd.print("BRAK INTERNETU ");
      errorlog =0;
    Serial.println("Reset");   
    digitalWrite(resetPin, LOW);
    } else{};
     
     
    } // END Loop
     
       
     
      void gong() {
            tone(PIEZO_PIN, 600); // Dzwięk alarmu
           delay(100);
          noTone(PIEZO_PIN); // Wyłączenie dźwięku alarmu
      }
     
     
     void mysql_kar() {   
      Ethernet.begin(mac, ip);
      delay(1000);
      Serial.println("connecting...");
      if (client.connect(server_d, 80)) {
        Serial.println("connected");
        client.print( "GET /karty.php?nr=");
        client.print(id_karty);
       client.print("&zda=");
       client.print(zmie);
       client.println( " HTTP/1.1");
       client.println( "Host: www.xxxxxxx.com" );//ur web server
       client.println( "Content-Type: application/x-www-form-urlencoded" );
       client.println( "Connection: close" );
        client.println();
      }
      else {
        Serial.println("nie polonczono");
        errorlog=1;
      }
    client.stop();
      }


     void mysql_temp() {    // wysyładnie temperatura 
      float piec =  sensors.getTempCByIndex(0);     
       Ethernet.begin(mac, ip);
      delay(1000);
      Serial.println("connecting...");
      if (client.connect(server_d, 80)) {
        Serial.println("connected");
        client.print("GET /temp_rejstracja.php?piec=");
        client.print(piec);
        client.print("&suszarnia=2");
        client.print("&zew=3");
       client.println( " HTTP/1.1");
       client.println( "Host: www.xxxxx.com" );//ur web server
       client.println( "Content-Type: application/x-www-form-urlencoded" );
       client.println( "Connection: close" );
       client.println();
      }
      else {
        Serial.println("nie polonczono");
        errorlog=1;
      }
    client.stop();
     }
     




    czekam na waszą opinie :)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    jaceklesniowski
    Poziom 10  
    Offline 
    Specjalizuje się w: programowanie
    jaceklesniowski napisał 14 postów o ocenie 6, pomógł 0 razy. Mieszka w mieście Mielec. Jest z nami od 2007 roku.
  • PCBway
  • #2
    szymon122
    Poziom 38  
    Czy połączenie z arduino jest jakoś zabezpieczane? Jest coś w stylu hasła czy każdy kto się podłączy może sterować światłem urządzając wam dyskotekę?
  • PCBway
  • #3
    jaceklesniowski
    Poziom 10  
    hasło dodałem później, aczkolwiek i tak zostawiłem nie aktywne bo mnie denerwowało za każdym razem jego podawanie. Żeby się podłączyć wewnątrz sieci IP musisz znać hasło do WiFi zewnątrz musisz znać moje IP plus nr portu na który jest przekierowany:) tym trochę utrudniłem. Jak na razie nikt dowcipów nie robił :)
  • #4
    PixelloxD
    Poziom 11  
    Mógłbyś wrzuciłbyś jakiś film jak to działa, jestem bardzo ciekawy.
  • #5
    globalinfo
    Poziom 13  
    Ciekawy projekt.
    MySQL jest na zewnętrznym serwerze?.
  • #6
    jaceklesniowski
    Poziom 10  
    TAK, na zewnętrznym, ale to nie ma znaczenia, bo można na wewnętrznym i zewnętrznym.