Inteligentny Dom v1
Witam wszystkich majsterkowiczów. Jest to mój pierwszy projekt na majsterkowie więc przepraszam za wszystkie błędy. Jest to również mój pierwszy większy projekt z wykorzystaniem platformy Arduino. W związku z tym, że chodzę do Technikum Informatycznego i trzeba podciągnąć oceny, wymyśliłem z kolegą, iż zrobimy projekt pt. „Inteligentny Dom Arduino –na każdą kieszeń”. Wiem tytuł taki sobie ;)
Przejdźmy do założeń projektowych:
- Sterowanie oświetleniem – manualnie oraz przez stronę WWW (4 pokoje)
- Odczyt oświetlenia – zapalone czy zgaszone
- Odsłanianie i zasłanianie rolet – 1 przycisk do wszystkich rolet lub zarządzanie każdą z osobna poprzez przeglądarkę
- Otwieranie i zamykanie bramy – zdalne i manualne
- Otwieranie i zamykanie drzwi – zdalne i manualne
- Monitorowanie temperatury w domu oraz na zewnątrz
- Alarm załączany kodem
- Monitorowanie stanu alarmu w przeglądarce
- Sterowanie umiejscowieniem kamery
- Po wykryciu ruchu (w trybie alarmu) obrót kamery w stronę pomieszczenia oraz wycie syreny
- Dzwonek do drzwi
- Ekran wyświetlający temperaturę, datę oraz elementy związane z alarmem – niezrealizowane z powodów technicznych
Wykorzystane elementy wraz z cenami:
– Klon Arduino MEGA2560 R3 Atmel ATMega2560 AVR USB – niestety klon, budżet 17-latka na chwilę obecną nie pozwolił na zakup oryginału – 58,00zł
– Moduł sieciowy arduino W5100 mikroSD AVR Ethernet – też klon – 32,00zł
– Moduł zasilacza przetwornica DC-DC LM2596 DW 2-35V – 5,90zł
– 2x Moduł PIR czujnik detektor ruchu HC-SR501 Arduino – 2x 5,90zł
– 5x SERVO SERWO Tower Pro SG90 9g ARDUINO AVR PIC ARM – 5x 7,90zł
– Moduł 4-kanałowy przekaźnik 5V 10A AVR ARM ARDUINO – 19,90zł
– Moduł 1-kanałowy przekaźnik 5V 10A AVR ARM ARDUINO – 6,40zł
– Klawiatura membranowa 4×4 Arduino AVR PIC ARM – 4,90zł
– Buzzer buzer z generatorem 5V przetwornik – 1,00zł
– 2x kamerka internetowa – znalazłem w szafie
– 9x Przełącznik microswitch switch TACT64NF 4mm – 9x 1,00zł
– 2x Czujnik temperatury DS18B20 ARDUINO TO92 1wire – 2x 4,50zł
– 9x Rezystor 10kΩ
– Rezystor 4,7 kΩ
– Taśma LED RGB(niecały 1m)
– bardzo dużo przewodów
– sporo kartonów
– kilka lasek kleju na ciepło
– kilka tubek kleju „magik
– rurki do insyminacji(można zastąpić słomkami do napojów)
– wykałaczki
– opakowania po płytach(jako szyby w oknach)
Makieta:
Makieta ma wymiary 70x60cm. Wykonałem ją z kartonu(różne grubości). Podstawa to kartonik z przyklejonym styropianem(podajże od małej lodówki). Wszystkie elementy kartonowe przymocowałem magikiem. Pozostałe elementy są przymocowane klejem na gorąco. W korytarzu przymocowałem 2x przewód 1,5mm obrany z izolacji. Zrobiłem to, aby nie trzeba było ciągnąć dodatkowych pojedynczych przewodów. Na dole jest GND, u góry 5V.Projekt makiety
Opis strony:
Strona WWW została stworzona bezpośrednio w kodzie arduino. Wygląd strony zdefiniowałem przy pomocy pliku CSS. W CSS-ie została podana ścieżka do grafiki dla poszczególnych div-ów. Szablon CSS jest wczytywany z zewnętrznej strony(w moim przypadku z facebooka – na coś się przydaje). Dlatego, żeby strona wyglądała jak na załączonym poniżej obrazku musimy mieć dostęp do Internetu. Dodam, że dostęp do tej strony mamy tylko i wyłącznie będąc połączonymi z tą samą siecią lokalną co Arduino. Link z facebooka jest przetrzymywany tylko kilka dni, jednakże na razie mi to wystarczy. W fazie finalnej projektu napewno to się zmieni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
html, body{ margin: 0; text-align: center; } #TLO{ width: 100%; background-image: url('http://inteligentny-dom.cba.pl/wp-content/uploads/2015/04/tlo.jpg'); margin: 0; } #STRONA{ width: 780px; margin-left: auto; margin-right: auto; text-align: center; } #NAGLOWEK{ background-image: url('http://inteligentny-dom.cba.pl/wp-content/uploads/2015/04/logo.jpg'); clear: both; width: 780px; height: 100PX; border-style: solid; border-width: thin; } #TRESC{ background-color: #0066FF; color: white; clear: both; width: 780px; height: 420px; border-style: solid; border-width: thin; border-color: black; } #TRESC1{ background-color: #0066FF; clear: both; width: 780px; height: 120px; border-style: solid; border-width: thin; border-color: black; } #TRESC2{ background-color: #0066FF; text-align: center; width: 388px; height: 410px; float: left; overflow: hidden; border-style: solid; border-width: thin; display:table-cell; vertical-align: middle; } #TRESC3{ background-color: #0066FF; text-align: center; width: 388px; height: 410px; float: left; overflow: hidden; border-style: solid; border-width: thin; display:table-cell; vertical-align: middle; } #TRESC4{ background-color: #0066FF; text-align: center; width: 780px; height: 160px; float: left; overflow: hidden; border-style: solid; border-width: thin; display:table-cell; vertical-align: middle; } #STOPKA{ clear: both; background-color: white; color: black; width: 780px; height: 70px; font-size: 18px; border-style: solid; border-width: thin; } #POMIESZCZENIE{ font-family: arial; color: black; font-size: 29px; } #ON{ font-family: arial; color: #66FF66; font-size: 25px; } #OFF{ font-family: arial; color: red; font-size: 25px; } #PRZYCISK{ width: 180px; height: 60px; font-family: arial; color: black; font-size: 20px; } #PRZYCISK1{ width: 85px; height: 60px; font-family: arial; color: black; font-size: 16px; } #TABELA{ text-align: center; width: 780px; height: 120px; float: center; border: 5px; border-color: black; border-style: solid; border-width: thin; |
Podłączenie elementów:
Do przetwornicy podłączyłem zasilacz 12V/2A. Od zasilacza poprowadziłem napięcie do przekaźników, które sterują zasilaniem pasków LED. Przetwornica zmienia napięcie na 5V, napięcie to podpiąłem pod główny przewód w makiecie(drut – ten do góry). Do tego drutu przylutowałem przewody: zasilanie dla Arduino, wszystkie zasilania servomechanizmów, wszystkie przyciski, czujniki – ogólnie wszystko zasilane napięciem 5V. Do drutu będącego -/GND przylutowałem wszystkie -/GND również ten od zasilacza. Do wszystkich przewodów wydrukowałem małe etykietki z nazwami: 5V, 12V, GND, pin i nazwa(np. 12 Przyc. SALON – co oznacza, że przycisk odpowiedzialny za włączenie i wyłączanie światła w salonie podpinam do pin-u 12 w Arduino). Kartkę z wydrukiem przykleiłem do taśmy dwustronnej, następnie wyciąłem i poprzyklejałem do kabelków. Wszystkie przewody podpiąłem zgodnie z opisami do płytki.
Teraz kod – kod jak kod, został napisany i tyle :) W niektórych miejscach zastosowane przeze mnie rozwiązania mogą wydawać się śmieszne, ale sądzę iż były najprostszymi przyjmując obecny stan mojej wiedzy i goniący mnie czas. Piszę tu np. o przypisywaniu wartości HIGH/LOW któremuś wolnemu pinowi w celu „zapamiętania” pozycji serva.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 |
/* Inteligentny DOM by PP190897 */ #include <SPI.h> #include <Ethernet.h> #include <Servo.h> #include <Keypad.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 49 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // WprowadĽ adres MAC i IP używany przez ARDUINO // MAC musi być inny niż urz±dzenia w sieci lokalnej // Adres IP używany w sieci lokalnej byte mac[] = { 0x10, 0xFE, 0xED, 0x04, 0x10, 0xE5 }; byte gateway[] = { 192, 168, 0, 1 }; // <------- Adres IP routera, z którym Ethernet shield jest połączony byte subnet[] = { 255, 255, 255, 0 }; // <------- Maska podsieci IPAddress ip(192,168,0,199);// <------- Adres przypisany Ethernet shieldowi // Inicjalizacja biblioteki Ethernet server // port 80 jest domyślny dla HTTP EthernetServer server(80); #define RELAY_CH1 31 #define RELAY_CH2 32 #define RELAY_CH3 33 #define RELAY_CH4 34 #define RELAY_CH5 35 String readString; int calibrationTime = 15; int button1 = 36; //kuchnia int button2 = 37; //pokój1 int button3 = 38; //pokój2 int button4 = 39; //salon int button5 = 40; //drzwi int button6 = 41; //dzwonek int button7 = 42; //brama int button8 = A11; //PC int button9 = 44; //rolety int PinA13 = A13; //stan servo int PinA14 = A14; //stan servo int PinA15 = A15; //stan servo int Pin31 = 31; //salon int Pin32 = 32; //pokój1 int Pin33 = 33; //pokój2 int Pin34 = 34; //kuchnia int Pin35 = 35; //PC int PinA12 = A12; //dzwonek int Pin49 = 49; //temperatura int PinA6 = A6; //hasło1 int PinA7 = A7; //hasło2 int PinA2 = A2; //hasło3 int PinA9 = A9; //hasło4 int PinA10 = A10; //hasło5 int PIR1 = 46; int PIR2 = 47; Servo SERVO1; //kuchnia1 Servo SERVO2; //kuchnia2 Servo SERVO3; //salon Servo SERVO4; //drzwi Servo SERVO5; //brama Servo SERVO6; //kamera const byte ROWS = 4; // Four rows const byte COLS = 4; // Four columns char keys[ROWS][COLS] = { { '1','2','3','A' } , { '4','5','6','B' } , { '7','8','9','C' } , { '*','0','#','D' } }; byte rowPins[ROWS] = { 30, 29, 28, 27}; byte colPins[COLS] = { 26, 25, 24, 23}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); char alarmstatus = 'N'; char alarm1 = 'N'; char alarm2 = 'N'; double tempin; double tempout; void setup() { sensors.begin(); sensors.setWaitForConversion(false); sensors.setResolution(12); sensors.requestTemperatures(); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(500); } SERVO1.attach(3); //definiujemy numer pinu dla danego servo SERVO2.attach(5); SERVO3.attach(6); SERVO4.attach(A8); SERVO5.attach(8); SERVO6.attach(9); SERVO1.write(110); SERVO2.write(125); SERVO3.write(110); SERVO4.write(15); SERVO5.write(90); SERVO6.write(130); pinMode(PinA13, OUTPUT); pinMode(PinA14, OUTPUT); pinMode(PinA15, OUTPUT); pinMode(Pin31, OUTPUT); //piny wyjściowe pinMode(Pin32, OUTPUT); pinMode(Pin33, OUTPUT); pinMode(Pin34, OUTPUT); pinMode(Pin35, OUTPUT); pinMode(PinA6, OUTPUT); pinMode(PinA7, OUTPUT); pinMode(PinA2, OUTPUT); pinMode(PinA9, OUTPUT); pinMode(PinA10, OUTPUT); pinMode(PinA12, OUTPUT); pinMode(Pin49, INPUT); //TEMP IN/OUT pinMode(PIR1, INPUT); //PIR1 pinMode(PIR2, INPUT); //PIR2 pinMode(button1, INPUT); pinMode(button2, INPUT); pinMode(button3, INPUT); pinMode(button4, INPUT); pinMode(button5, INPUT); pinMode(button6, INPUT); pinMode(button7, INPUT); pinMode(button8, INPUT); pinMode(button9, INPUT); digitalWrite(button1, LOW); digitalWrite(button2, LOW); digitalWrite(button3, LOW); digitalWrite(button4, LOW); digitalWrite(button5, LOW); digitalWrite(button6, LOW); digitalWrite(button7, LOW); digitalWrite(button8, LOW); digitalWrite(button9, LOW); digitalWrite(PinA6, LOW); digitalWrite(PinA7, LOW); digitalWrite(PinA2, LOW); digitalWrite(PinA9, LOW); digitalWrite(PinA10, LOW); digitalWrite(PinA12, LOW); digitalWrite(PinA13, LOW); digitalWrite(PinA14, LOW); digitalWrite(PinA15, LOW); digitalWrite(PIR1, LOW); digitalWrite(PIR2, LOW); pinMode(RELAY_CH1, OUTPUT); digitalWrite(RELAY_CH1, LOW); pinMode(RELAY_CH2, OUTPUT); digitalWrite(RELAY_CH2, LOW); pinMode(RELAY_CH3, OUTPUT); digitalWrite(RELAY_CH3, LOW); pinMode(RELAY_CH4, OUTPUT); digitalWrite(RELAY_CH4, LOW); pinMode(RELAY_CH5, OUTPUT); digitalWrite(RELAY_CH5, LOW); // Otwarcie komunikacji szeregowej Serial.begin(9600); // startowanie połączenia z internetem i serwerem Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); } boolean stan=0; void loop() { //nasłuchiwanie klientów przychodzących EthernetClient client = server.available(); if (client) { char* params; sensors.requestTemperatures(); tempin = sensors.getTempCByIndex(0); sensors.requestTemperatures(); tempout = sensors.getTempCByIndex(1); Serial.println("nowy klient"); boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 100) { readString += c; } Serial.write(c); if (c == '\n' && currentLineIsBlank) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.println("<?xml version=\"1.0\" encoding=\"utf-8\">"); client.println("<!DOCTYPE html PUBLIC>"); client.println("<html xmlns=\"http://www.w3.org/1999/xhtml\"> "); client.println("<HEAD>"); client.println("<meta http-equiv=\"Content-Type\" content=\"text/html\"; charset=\"utf-8\" />"); client.println("<title>INTELIGENTNY DOM</title>"); client.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.fbsbx.com/hphotos-xfp1/v/t59.2708-21/11151302_448339528672583_612728063_n.css/projekt.css?oh=f734d0f7a81c6fffeed969635a8c37ce&oe=552AAD08&dl=1\">"); client.println("</HEAD>"); client.println("<body xml:lang=\"pl\">"); client.println("<div id=\"TLO\">"); client.println("<div id=\"STRONA\">"); client.println("<div id=\"NAGLOWEK\"></div>"); client.println("<div id=\"TRESC\">"); client.println("<center>"); client.println("<h2>TEMPERATURA</h2>"); client.println("<BR/>"); client.println("<button id=\"PRZYCISK\">IN<BR/>"); client.println(tempin); client.println("</button> "); client.println("<button id=\"PRZYCISK\">OUT<BR/>"); client.println(tempout); client.println("</button> "); client.println("<h2><BR/>ALARM"); client.println("<BR/>STATUS:"); client.println(alarmstatus); client.println("</h2>"); client.println("<button id=\"PRZYCISK\">KORYTARZ:"); client.println(alarm1); client.println("</button> "); client.println("<button id=\"PRZYCISK\">STEROWNIA:"); client.println(alarm2); client.println("</button> "); client.println("<br/><br/><a href=\"http://192.168.0.199\"><button id=\"PRZYCISK\">ODŚWIEŻ</button> </a> "); client.println("</center></div> "); client.println("<div id=\"TRESC1\"> "); client.println("<table id=\"TABELA\">"); client.println("<tr>"); if (digitalRead(RELAY_CH1)) { client.print("<td> <p id=\"POMIESZCZENIE\">SALON</p><p id=\"ON\">ON</p> </td>"); } else { client.print("<td> <p id=\"POMIESZCZENIE\">SALON</p><p id=\"OFF\">OFF</p></td>"); } if (digitalRead(RELAY_CH2)) { client.print("<td> <p id=\"POMIESZCZENIE\">POKÓJ 1</p><p id=\"ON\">ON</p></td>"); } else { client.print("<td> <p id=\"POMIESZCZENIE\">POKÓJ 1</p><p id=\"OFF\">OFF</p></td>"); } if (digitalRead(RELAY_CH3)) { client.print("<td><p id=\"POMIESZCZENIE\">POKÓJ 2</p><p id=\"ON\">ON</p></td>"); } else { client.print("<td><p id=\"POMIESZCZENIE\">POKÓJ 2</p><p id=\"OFF\">OFF</p></td>"); } if (digitalRead(RELAY_CH4)) { client.print("<td><p id=\"POMIESZCZENIE\">KUCHNIA</p><p id=\"ON\">ON</p></td>"); } else { client.print("<td><p id=\"POMIESZCZENIE\">KUCHNIA</p><p id=\"OFF\">OFF</p></td>"); } if (digitalRead(RELAY_CH5)) { client.print("<td><p id=\"POMIESZCZENIE\">PC</p><p id=\"ON\">ON</p></td>"); } else { client.print("<td><p id=\"POMIESZCZENIE\">PC</p><p id=\"OFF\">OFF</p></td>"); } client.println("</tr>"); client.println("</table>"); client.println("</center>"); client.println("</div>"); client.println("<div id=\"TRESC2\"> "); client.println("<br/><a href=\"/?relay1on\"\"><button id=\"PRZYCISK\">SALON ON</button> </a> "); client.println("<a href=\"/?relay1off\"\"> <button id=\"PRZYCISK\">SALON OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?relay2on\"\"> <button id=\"PRZYCISK\">POKOJ 1 ON</button> </a> "); client.println("<a href=\"/?relay2off\"\"> <button id=\"PRZYCISK\">POKOJ 1 OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?relay3on\"\"> <button id=\"PRZYCISK\">POKOJ 2 ON</button> </a> "); client.println("<a href=\"/?relay3off\"\"> <button id=\"PRZYCISK\">POKOJ 2 OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?relay4on\"\"> <button id=\"PRZYCISK\">KUCHNIA ON</button> </a> "); client.println("<a href=\"/?relay4off\"\"> <button id=\"PRZYCISK\">KUCHNIA OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?relay5on\"\"> <button id=\"PRZYCISK\">PC ON</button> </a> "); client.println("<a href=\"/?relay5off\"\"><button id=\"PRZYCISK\">PC OFF</button> </a> "); client.println("</div>"); client.println("<div id=\"TRESC3\"> "); client.println("<br/><a href=\"/?servo1on\"\"> <button id=\"PRZYCISK\">ROLETA1 ON</button> </a> "); client.println("<a href=\"/?servo1off\"\"><button id=\"PRZYCISK\">ROLETA1 OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?servo2on\"\"> <button id=\"PRZYCISK\">ROLETA2 ON</button> </a> "); client.println("<a href=\"/?servo2off\"\"><button id=\"PRZYCISK\">ROLETA2 OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?servo3on\"\"> <button id=\"PRZYCISK\">ROLETA3 ON</button> </a> "); client.println("<a href=\"/?servo3off\"\"><button id=\"PRZYCISK\">ROLETA3 OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?servo4on\"\"> <button id=\"PRZYCISK\">DRZWI ON</button> </a> "); client.println("<a href=\"/?servo4off\"\"><button id=\"PRZYCISK\">DRZWI OFF</button> </a> <br />"); client.println("<br />"); client.println("<a href=\"/?servo5on\"\"> <button id=\"PRZYCISK\">BRAMA ON</button> </a> "); client.println("<a href=\"/?servo5off\"\"><button id=\"PRZYCISK\">BRAMA OFF</button> </a> <br />"); client.println("<br />"); client.println("</div>"); client.println("<div id=\"TRESC4\"> "); client.println("<br/><button id=\"PRZYCISK\">KAMERA</font> </button><br /><br />"); client.println("<a href=\"/?servo6on1\"\"> <button id=\"PRZYCISK1\"><--</button> </a> "); client.println("<a href=\"/?servo6on\"\"> <button id=\"PRZYCISK1\"><----</button> </a> "); client.println("<a href=\"/?servo6off\"\"><button id=\"PRZYCISK1\">----></button> </a> "); client.println("<a href=\"/?servo6off1\"\"><button id=\"PRZYCISK1\">--></button> </a> <br />"); client.println("</div>"); if(readString.indexOf("?relay1on") >0) { digitalWrite(RELAY_CH1, HIGH); } if(readString.indexOf("?relay1off") >0) { digitalWrite(RELAY_CH1, LOW); } if(readString.indexOf("?relay2on") >0) { digitalWrite(RELAY_CH2, HIGH); } if(readString.indexOf("?relay2off") >0) { digitalWrite(RELAY_CH2, LOW); } if(readString.indexOf("?relay3on") >0) { digitalWrite(RELAY_CH3, HIGH); } if(readString.indexOf("?relay3off") >0) { digitalWrite(RELAY_CH3, LOW); } if(readString.indexOf("?relay4on") >0) { digitalWrite(RELAY_CH4, HIGH); } if(readString.indexOf("?relay4off") >0) { digitalWrite(RELAY_CH4, LOW); } if(readString.indexOf("?relay5on") >0) { digitalWrite(RELAY_CH5, HIGH); } if(readString.indexOf("?relay5off") >0) { digitalWrite(RELAY_CH5, LOW); } if(readString.indexOf("?servo1on") >0) { SERVO1.write(35); digitalWrite(PinA13, HIGH); } if(readString.indexOf("?servo1off") >0) { SERVO1.write(110); digitalWrite(PinA13, LOW); } if(readString.indexOf("?servo2on") >0) { SERVO2.write(45); } if(readString.indexOf("?servo2off") >0) { SERVO2.write(125); } if(readString.indexOf("?servo3on") >0) { SERVO3.write(35); } if(readString.indexOf("?servo3off") >0) { SERVO3.write(110); } if(readString.indexOf("?servo4on") >0) { SERVO4.write(110); digitalWrite(PinA14, LOW); } if(readString.indexOf("?servo4off") >0) { SERVO4.write(15); digitalWrite(PinA14, HIGH); } if(readString.indexOf("?servo5on") >0) { SERVO5.write(90); digitalWrite(PinA15, LOW); } if(readString.indexOf("?servo5off") >0) { SERVO5.write(180); digitalWrite(PinA15, HIGH); } if(readString.indexOf("?servo6on1") >0) { SERVO6.write(80); } if(readString.indexOf("?servo6on") >0) { SERVO6.write(40); } if(readString.indexOf("?servo6off") >0) { SERVO6.write(170); } if(readString.indexOf("?servo6off1") >0) { SERVO6.write(130); } // TEMP IN if (strcmp(params, "tempin") == 0) { sensors.requestTemperatures(); tempin = sensors.getTempCByIndex(0)*100; client.print(tempin); } // TEMP OUT if (strcmp(params, "tempout") == 0) { sensors.requestTemperatures(); tempout = sensors.getTempCByIndex(1)*100; client.print(tempout); } client.println("<div id=\"STOPKA\"> "); client.println("INTELIGENTNY DOM<br/>Arduino – na kazdą kieszeń<br>Patryk & Leszek"); client.println("</div> "); client.println("</div> "); client.println("</div> "); readString=""; client.println("</body>"); client.println("</html>"); break; }// if ( c == \n ) if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(2); client.stop(); Serial.println("client disonnected"); } //kończy Client if (digitalRead(button1) == HIGH) { delay(20); stan=!stan; digitalWrite(34, stan); while(digitalRead(button1)== HIGH); delay(20); } if (digitalRead(button2) == HIGH) { delay(20); stan=!stan; digitalWrite(32, stan); while(digitalRead(button2)== HIGH); delay(20); } if (digitalRead(button3) == HIGH) { delay(30); stan=!stan; digitalWrite(33, stan); while(digitalRead(button3)== HIGH); delay(20); } if (digitalRead(button4) == HIGH) { delay(20); stan=!stan; digitalWrite(31, stan); while(digitalRead(button4)== HIGH); delay(20); } if (digitalRead(button8) == HIGH) { delay(20); digitalWrite(35, HIGH); delay(100); digitalWrite(35, LOW); while(digitalRead(button3)== HIGH); delay(20); } if (digitalRead(button6) == HIGH) { delay(20); digitalWrite(PinA12, HIGH); tone(PinA12, 261); delay(2000); digitalWrite(PinA12, LOW); noTone(PinA12); while(digitalRead(button6)== HIGH); delay(20); } if (digitalRead(button7) == HIGH) { delay(20); stan=!stan; if (digitalRead(PinA15) == LOW) { SERVO5.write(90); } else { SERVO5.write(180); } digitalWrite(PinA15, stan); while(digitalRead(button7)== HIGH); delay(20); } if (digitalRead(button5) == HIGH) { delay(20); stan=!stan; if (digitalRead(PinA14) == LOW) { SERVO4.write(110); } else { SERVO4.write(15); } digitalWrite(PinA14, stan); while(digitalRead(button5)== HIGH); delay(20); } if (digitalRead(button9) == HIGH) { delay(20); stan=!stan; if (digitalRead(PinA13) == LOW) { SERVO1.write(110); SERVO2.write(125); SERVO3.write(110); } else { SERVO1.write(35); SERVO2.write(45); SERVO3.write(35); } digitalWrite(PinA13, stan); while(digitalRead(button9)== HIGH); delay(20); } char key = keypad.getKey(); if (key == '2') { delay(10); digitalWrite(PinA6, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); digitalWrite(Pin31, HIGH); } if (key == '5') { delay(10); digitalWrite(PinA7, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); digitalWrite(Pin32, HIGH); } if (key == '8') { delay(10); digitalWrite(PinA2, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); digitalWrite(Pin33, HIGH); } if (key == '0') { delay(10); digitalWrite(PinA9, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); digitalWrite(Pin34, HIGH); } if (key == '#') { delay(10); digitalWrite(PinA10, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); SERVO4.write(15); } if (key == '*') { delay(10); alarmstatus = 'N'; alarm1 = 'N'; alarm2 = 'N'; digitalWrite(PinA6, LOW); digitalWrite(PinA7, LOW); digitalWrite(PinA2, LOW); digitalWrite(PinA9, LOW); digitalWrite(PinA10, LOW); digitalWrite(PIR1, LOW); digitalWrite(PIR2, LOW); digitalWrite(Pin31, LOW); digitalWrite(Pin32, LOW); digitalWrite(Pin33, LOW); digitalWrite(Pin34, LOW); noTone(PinA12); digitalWrite(PinA12, LOW); SERVO6.write(130); } if (key == '1') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if (key == '3') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if (key == '4') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if (key == '6') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if (key == '7') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if (key == '9') { delay(10); digitalWrite(PinA12, HIGH); tone(PinA12, 500); delay(30); noTone(PinA12); digitalWrite(PinA12, LOW); } if ((digitalRead(PinA6) == HIGH) && (digitalRead(PinA7) == HIGH) && (digitalRead(PinA2) == HIGH) && (digitalRead(PinA9) == HIGH) && (digitalRead(PinA10) == HIGH)){ alarmstatus = 'T'; digitalWrite(Pin31, LOW); digitalWrite(Pin32, LOW); digitalWrite(Pin33, LOW); digitalWrite(Pin34, LOW); delay(100); digitalWrite(Pin31, LOW); digitalWrite(Pin32, LOW); digitalWrite(Pin33, LOW); digitalWrite(Pin34, LOW); if (digitalRead(PIR1) == HIGH){ alarm1 = 'T'; digitalWrite(Pin31, HIGH); digitalWrite(Pin32, HIGH); digitalWrite(Pin33, HIGH); digitalWrite(Pin34, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 350); SERVO6.write(60); } if (digitalRead(PIR2) == HIGH){ alarm2 = 'T'; digitalWrite(Pin31, HIGH); digitalWrite(Pin32, HIGH); digitalWrite(Pin33, HIGH); digitalWrite(Pin34, HIGH); digitalWrite(PinA12, HIGH); tone(PinA12, 350); SERVO6.write(20); } } } // kończy Loop |
Film przedstawiający działanie makiety
Na koniec dodam, że w czasie wakacji planuję rozwinąć projekt, a w sumie wykonać go od początku. Makieta prawdopodobnie będzie raz większa oraz drewniana, przewody zostaną schowane. Strona wraz z CSS-em oraz grafiką ma być ładowana z microSD. Planuję usprawnić alarm i wiele, wiele innych zmian, ale nie ma co chwalić dnia przed zachodem słońca.
W razie jakiś niejasności chętnie pomogę i wyjaśnię wszelkie wątpliwości w miarę możliwości. – rymowanka wyszła
Mam nadzieję, że mój projekt zainspiruje kogoś do wdrożenia niektórych rozwiązań w prawdziwym domu.
Pozdrawiam
Przyszły Informatyk ;)
Pomysł na 5. Czepiłbym się tylko jakości wykonania. Przewody można było puścić pod posadzką :-)
Niestety wiem, że jakość wykonania słaba, jednak tu głównie chodziło o funkcjonalność. W projekcie V2 na pewno to poprawie. Proszę komentować. Przyjmę każdą poradę jak i krytykę :)
Jak ktoś ocenia nisko to niech napisze za co, żebym wiedział co poprawić.
Fajne:) Zrób kolejne wersje w co raz większej skali, a jak skończysz technikum, to już nie pozostanie nic innego, jak tylko zamienić to w biznes:)
Kawał dobrej roboty!
Nie zapomnij się pochwalić, gdy makieta będzie drewniana!
Dzięki. Jeśli wszystko wyjdzie to na pewno się pochwalę ;)
Witaj. Projekt fajny i ciekawy. Czekam na finalną wersję. Było by 5 ale jedna rażąca wada w artykule nazwa projektu. Niby nic ale “Inteligentny” dom ? niestety inteligencji w tym nie ma jest to po prostu automatyka domowa. Tego chwytu używają sprzedawcy, żeby zachwalać swój projekt. Inteligentny dom to taki który sam się uczy i dostosowuje do indywidualnie do każdego użytkownika i jest wstanie reagować poprawnie na nowe zdarzenia.
Zgadzam się z tobą w 100%, ale z drugiej strony jak to nazwać? Zaprogramowany dom? Mało ciekawy tytuł.
Sorki, zapomniałem się zalogować.
“Automatyka domowa v1”
A dla mnie bomba! Jeszcze zamiast kabli przydałoby się dołożyć łączność bezprzewodową.
Gratulacje.
PB
A ja jestem przeciwny stosowania łączności bezprzewodowej w takich instalacjach. Z trzech powodów:
“C” mi się zacięło i walnąłem takiego paskudnego ortografa w swoim imieniu, że aż wstyd :(
Jak dla mnie, to w końcu coś z sensowniejszą realizacją w tym temacie – założenia spełnione w całości, a nie jak w większości tego typu projektów jest wyszczególniona, jak ja to mówię, “lista życzeń” lub “lista marzeń”, a następnie opisana funkcja załącz/wyłącz przekaźnik i reszty doczekać się nie można, bo autorzy znikają
Spodobało mi się w tej makiecie to, że każde pomieszczenie podświetla się w innym kolorze – ot, niby takie pierdółko, ale do makiety idealne :)
A teraz (drobne) uwagi:
– otwieranie drzwi może być tylko w formie makiety – w realnym świecie nie ma to zastosowania (a szkoda)
– jeśli opisujesz w kodzie piny to rób to tak jak w przypadku czujników ruchu, bo oznaczenia zmiennych w formie
“int button1 = 36; //kuchnia
int button2 = 37; //pokój1
int button3 = 38; //pokój2”
jest bardzo nieczytelne w dalszych częściach kodu (aby zrozumieć co dana funkcja robi trzeba co chwilę spoglądać, który pin za co odpowiada) przez co kod staje się nieczytelny
“if (digitalRead(PIR1) == HIGH){”
chyba przyznasz, że to jest bardziej czytelne w dalszej części kodu, bo od razu widać, że np warunek sprawdza stan czujki itd :)
Projekt udany i życzę powodzenia :)
Dzięki wielkie. Tak to jest jak pisze się kod w kilku etapach to później różnie wychodzi – przyszłe projekty będą czytelniejsze. Drzwi to naprawdę prowizorka, ale rolę spełniają. Nie miałem pomysłu jak to zrobić inaczej. Teraz mam już pewien pomysł ;)
Nieprzydatność otwierania drzwi nie jest taka całkowita – oczywiście nie chodzi o fizyczne otwarcie drzwi, ale sterowanie zamkiem elektrycznym, czy jakąś zasuwą – ma sens.
Do autora – jak z wersją 2 ?
Po co dawac dwa przyciski on/off w przegladarce skoro program odczytuje stan ;p? Ogolnie projekt fajny ale widze tutaj wiele do poprawienia.
W sumie racja z tymi przyciskami. Nie przyszło mi to do głowy. Człowiek cały czas się uczy ;)
Świetny projekt, jakość wykonania trochę kuleje, ale jak sam napisałeś jest to dopiero pierwsza wersja. Czekam więc na kolejną :)
Kolejna wersja będzie na pewno, pytanie czy wyrobię się przez wakacje. Trzymaj kciuki :)
Trzymam :)
Trzymam :)
Projekt wykonany fajnie – fajna markiza jak na początek. Mam jedną uwagę co do bezpieczeństwa, zrób chociaż logowanie do strony www , bo tak ktokolwiek by się podłączył do sieci Wi-Fi mógłby sterować np. ogrzewaniem na 80 stopni Celcjusza …
Reszta nawet fajne :)
Jeszcze czegos takiego nie robiłem to może byc wyzwanie ale oczywiście spróbuje
Widać że bawi Cię to co zrobiłeś i to w tym wszystkim najważniejsze. Zawsze się tu znajdzie jakiś krytyk który sam nic nie wstawi bo go skrytykują ;) Projekt na 5 mimo że tylko teoretycznie do praktycznego zastosowania. Czekam na Twoje kolejne prace , początek bardzo dobry :) I pamiętaj! nie tłumacz się ;)
Projekt fajny nie powiem, jeszcze tylko nad bardziej “profesjonalnym” wykonaniem trzeba popracować. To taka wersja beta w połowie drogi trochę :)
Jak na przyszłego informatyka, to bardzo profesjonalnie i rzetelnie przedstawiłeś swoją pracę :)
Gdzie moge kupić taki klon Arduino?
Od jakiego języka polecasz zacząć nauke programowania, a jakiego ty używasz?
PS. To co zrobiłeś jest świetne!
Klon Arduino polecam od tego użytkownika http://allegro.pl/klon-arduino-mega2560-r3-atmel-atmega2560-avr-usb-i4876828577.html Zdarzyła mi się reklamacja, ale to bardziej z mojej winy, jednak bez problemu wymienili mi na nowe. To co napisałem jest w języku Arduino, stwierdzam że jest on bardzo prosty. Dodam, iż jestem dość leniwy i bardzo nie lubię czytać książek, dlatego nie przeczytałem żadnej. Za to przejrzałem mnóstwo forów, przeanalizowałem dziesiątki jak nie setki kodów i tak samo przyszło. Jak widać jakiś efekt z takiej nauki też jest. Polecam obejrzeć odcinki Elektroprzewodnika na youtubie(niektóre są dość nudne ale w większości mówi ciekawie) oraz Elektro Maras. Życzę ci miłej zabawy.
PS. Czasami warto ustanowić sobie jakiś większy cel(nawet ponad swoje możliwości) i małymi kroczkami do niego dążyć.
Siema! Też zaczynam zabawę z portami GPOI i Raspberry pi i szukam jakiś książek o programowaniu wejść/wyjść itp i chciałem się dowiedzieć z czego się uczyłeś? :D
Super, jak będziesz robił V2 to koniecznie poukrywaj przewody i moze podostawiaj jakieś mebelki :)
A może ludziki..? :)
P.S. Inteligentny domek dla lalek, sterowanie komputerowe. Już widzę, jak rodzice zamykają przez internet domek, żeby się dziecko nie bawiło po nocy ;)
Świetny projekt. mi się marzy takie coś na działce. Loguje się na telefonie do aplikacji i mogę włączyć np ogrzewanie.
Nie ma co marzyć, trzeba przejść do realizacji ;) Projekt nie byłby trudny w realizacji. Widziałem kilka fajnych projektów z wykorzystaniem starego telefonu. Wtedy wysyłasz sms-a gdziekolwiek jesteś i ogrzewanie się załączy.
Witaj. Jak na ucznia technikum to zdecydowanie dzieło sztuki. Widzę spryt i wysiłek w Twojej pracy. Jeśli chcesz – pogadajmy prywatnie. Mogę zaproponować Ci rozszerzenie możliwości finansowych byś mógł kontynuować to co zacząłeś, w zamian za pomoc w moim projekcie.
anonymouslord1(at)gmail.com
To może w następnym kroku opcja sterowania poprzez smartfon/tablet :D
Chyba chodzi Ci o aplikację na smartfon/tablet, bo sterować można tak samo przez stronę WWW. Spróbuje.
Fajna opcja. Musze przemyśleć to w swoim domu.
ciężkie jest zycie informatyka :( jakbym wiedział, ze to zrobiłeś i upubliczniłes, to bym nie klikał tutaj, takto odpadł mi…. cały zapał i entuzjazm do robienia tego projektu od zera dla siebie :(
mając gotowca i znając go niestety mógłby posłużyć za ściągę…
błagam nie uświadamiajcie mnie tylko, że ktoś już zrobił klona iRoomba na atmega, bo to mój następny pomysł na liście…
Pozdrawiam – informatyk.
Do końca wakacji na pewno nie będzie wersji V2.
I jak tam prace nad wersją 2?
Niestety na razie ambicje przerosły możliwości czasowe, ale w szkole będzie do zrobienia projekt tak jak w zeszłym roku, dlatego coś się może ruszy.
Tworzę stronę na zajęcia związaną z projektami opartymi o arduino. Na razie jeszcze nic na niej nie ma ale stopniowo będę ją dopracowywał, dlatego już zapraszam do zaglądania.
ardupro.drupalgardens.com
Co to ma byc? MOZE ZAGALOPAWALES SIE kolego?
Popraw błędy językowe na stonce, bo strasznie rażą…
Jakieś kontakt z tobą ? bo ma parę pytań ?
Witam.
Jestem od niedawna w majsterkowo.pl
Pracuje nad czymś podobnym do własnego domu.
Prosił bym Cie “pp190897” o kontakt mpolak123@wp.pl mam kilka pytań na które nie znajduje odpowiedzi a myślę że Ty mógłbys mi pomóc.
Pozdrawiam
MPolak
Co polecacie bardziej do makiety inteligentnego domu raspberry czy arduino, chcę zbudować coś w podobie do tego co wykonał autor posta i nie wiem co wybrac.