Ahoj, idem sa opäť podeliť s ďalším projektom.
Robil som trošku špecifický projekt pre 2 chaty, ktoré sú ovládané na diaľku, kedy má každý z používateľov (majiteľov každej chaty) svoje stránky, kde si spravuje svoje výstupy, v pozícii mikrokontroléra bolo Arduino Due a Ethernet shield W5100, ktoré má dostatok GPIO pinov aj pre 16 kanálové relé. To bolo umiestnené v jednej chate z ktorej sa riadili obe. Nakoľko Arduino Due nemá každý, keďže je z inej cenovej kategórie, vzorové zverejnené Arduino kódy pre tento sú uspôsobené pre 2 dosky Arduino Mega s Ethernet shieldami W5100 od Wiznetu, aby ste si ich mohli aj fyzicky reálne vyskúšať.
Web časť pre projekt je napísaná v jazyku PHP, stará sa o správu prihlásení, zmeny stavov relé, zmeny názvov pre relé a zmenu prihlasovacích kontaktov. Existujú 2 používateľské kontá, v každom z nich je možné ovládať 8 výstupov. Jeden používateľ nevidí na výstupy druhého a ani ich nemôže meniť. Súčasne môžu byť vo webaplikácii aj obaja používatelia naraz a každý z nich si môže spravovať svoje výstupy, jeden druhého neobmedzujú a svoju aktivitu nevidia.
Demo, ktoré som pripravil má tieto prihlasovacie údaje, s ktorými je možné webaplikáciu vyskúšať:
1. používateľ2. používateľPrihlasovacie údaje sa dajú vo web časti zmeniť, mení si ich každý používateľ samostatne.
Stránky sa skladajú z login stránky a funkčných stránok za prihlásením. Ak nie je používateľ prihlásený, nebude sa môcť na fukčné stránky dostať, bude automaticky presmerovaný na login stránku.
Funkčné stránky (za prihlásením) majú za úlohu:Prepínanie relé (ZAP/VYP)
Zmena prihlasovacích informácii
Bezpečné odhlásenie z aplikácie
Hardvérové charakteristiky:
Existujú hlavné 2 typy relé, ktoré sa k Arduinu pre tento účel používajú. Elektromagnetické relé, prostredníctvom ktorých je možné spínať maximálne 230V 10A v striedavej sústave, prípadne 30V 10A v jednosmernej sústave. Tento typ relé je vhodný aj pre kapacitnú záťaž, či pre spínanie vyšších výkonov do 2,3kW pri striedavej sústave.
V prípade spínania nižších výkonov, napríklad svetiel sú obľúbené SSR relé, ktorými je možné spínať maximálne 230V 2A pri striedavej sústave.
Relé majú prakticky neobmedzenú životnosť, nakoľko nemajú mechanickú časť. Jedinou limitáciou pri tomto type relé (používanom pri Arduine) je iba možnosť spínať striedavý prúd, nakoľko sa ako riadiaci prvok používa polovodičová súčiastka triak.
Screenshoty webaplikácie:Funkčnosť Arduino scriptovCyklické čítanie stavov relé v 5 - sekundových intervaloch s ich aplikáciou ihneď po prečítaní. Odozva 5 sekúnd na zmenu je maximálna.
Arduino program pre 8 relé s loginom user1 heslom user1Kód:
#include <SPI.h>
#include <Ethernet.h> //Zmenit pre Ethernet2.h pre W5500
const int vystup1 = 0;
const int vystup2 = 1;
const int vystup3 = 2;
const int vystup4 = 3;
//D4 vynechany - pre SD kartu
const int vystup5 = 5;
const int vystup6 = 6;
const int vystup7 = 7;
const int vystup8 = 8;
byte mac[] = { 0xAA, 0xBB, 0xCC, 0x81, 0x7B, 0x4A }; //fyzicka adresa MAC
char serverName[] = "www.arduino.php5.sk"; // webserver
IPAddress ip(192, 168, 1, 254);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(vystup1, OUTPUT);
pinMode(vystup2, OUTPUT);
pinMode(vystup3, OUTPUT);
pinMode(vystup4, OUTPUT);
pinMode(vystup5, OUTPUT);
pinMode(vystup6, OUTPUT);
pinMode(vystup7, OUTPUT);
pinMode(vystup8, OUTPUT);
if (Ethernet.begin(mac) == 0) {
Serial.println("DHCP nepridelilo adresu, skusam so statickou...");
Ethernet.begin(mac, ip); //nastav k mac adrese i IP adresu staticku
}
Serial.begin(9600);
}
void stav_vystup1(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele1.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup1, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup1, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup2(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele2.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup2, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup2, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup3(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele3.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup3, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup3, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup4(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele4.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup4, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup4, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup5(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele5.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup5, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup5, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup6(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele6.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup6, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup6, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup7(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele7.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup7, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup7, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup8(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele8.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup8, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup8, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void loop(){
stav_vystup1();
stav_vystup2();
stav_vystup3();
stav_vystup4();
stav_vystup5();
stav_vystup6();
stav_vystup7();
stav_vystup8();
delay(5000); //opakuj slucku loop o 5 sekund
}
Arduino program pre 8 relé s loginom admin heslom adminKód:
#include <SPI.h>
#include <Ethernet.h>
const int vystup1 = 0;
const int vystup2 = 1;
const int vystup3 = 2;
const int vystup4 = 3;
//D4 vynechany - pre SD kartu
const int vystup5 = 5;
const int vystup6 = 6;
const int vystup7 = 7;
const int vystup8 = 8;
byte mac[] = { 0xAA, 0xBB, 0xCC, 0x81, 0x7B, 0x4C }; //fyzicka adresa MAC
char serverName[] = "www.arduino.php5.sk"; // webserver
IPAddress ip(192, 168, 1, 253);
EthernetClient client;
String readString;
int x=0; //pocitadlo riadkov
char lf=10; //line feed character
void setup(){
pinMode(vystup1, OUTPUT);
pinMode(vystup2, OUTPUT);
pinMode(vystup3, OUTPUT);
pinMode(vystup4, OUTPUT);
pinMode(vystup5, OUTPUT);
pinMode(vystup6, OUTPUT);
pinMode(vystup7, OUTPUT);
pinMode(vystup8, OUTPUT);
if (Ethernet.begin(mac) == 0) {
Serial.println("DHCP nepridelilo adresu, skusam so statickou...");
Ethernet.begin(mac, ip); //nastav k mac adrese i IP adresu staticku
}
Serial.begin(9600);
}
void stav_vystup1(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele10.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup1, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup1, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup2(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele11.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup2, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup2, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup3(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele12.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup3, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup3, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup4(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele13.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup4, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup4, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup5(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele14.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup5, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup5, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup6(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele15.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup6, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup6, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup7(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele16.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup7, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup7, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void stav_vystup8(){
if (client.connect(serverName, 80)) { //starts client connection, checks for connection
Serial.println("connected");
client.println("GET /rele/rele17.txt HTTP/1.1"); //download text
client.println("Host: www.arduino.php5.sk");
client.println("Connection: close"); // ukonc HTTP/1.1 spojenie
client.println(); //koneic requestu
}
else {
Serial.println("Pripojenie neuspesne"); //chyba ak nie som pripojeny
Serial.println();
}
while(client.connected() && !client.available()) delay(1); //cakaj na data
while (client.connected() || client.available()) { //pramenna
char c = client.read(); //dostan bity z buffera
Serial.print(c); //cela http hlavicka
if (c==lf) x=(x+1); //pocitaj
else if (x==12) readString += c; //nasa premenna
}
if(readString=="ZAP"){
digitalWrite(vystup8, HIGH);
}else if(readString=="VYP"){
digitalWrite(vystup8, LOW);
}
else{
Serial.println("Nepodporovany stav! - chyba");
}
readString = ("");
x=0;
client.stop(); //ukonc spojenie
}
void loop(){
stav_vystup1();
stav_vystup2();
stav_vystup3();
stav_vystup4();
stav_vystup5();
stav_vystup6();
stav_vystup7();
stav_vystup8();
delay(5000); //opakuj slucku loop o 5 sekund
}
Zdrojové kódy sú plne kompatibilné s webovou stránkou na adrese:
https://arduino.php5.sk/rele/Viac informácii o projekte je možné nájsť na:
https://arduino.php5.sk/ovladanie-rele.phpProgram je plne kompatibilný aj s iným - často využívaným Ethernet modulom Wiznet W5200 či W5500 pre Arduino. V zdrojových kódoch je nutné modifikovať iba knižnicu na Ethernet2.h.
Program po nahratí plne komunikuje s webom po HTTP protokole a zmeny stavov z webového rozhrania si môžete vyskúšať. Pri projekte treba pamätať aj nato, že relé sú prepnuté na dobu neurčitú, čo je aj nevýhoda tohto projektu, napríklad pri použití relé na kotol, či iný rizikový spotrebič.