Arduino webserver/client

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Arduino webserver/client

Príspevok od používateľa Kurrur » 08 Máj 2015, 23:34

Dobrý den pánové, mám delší dobu problém s řízením PWM a bohužel málo času za chvíli odjíždím mimo ČR a Arduinu se věnuju když se zadaří hodinku denně. Potřeboval bych přes přes HTML ovládat PWM nejlépe přes nějaký slidebar nebo zadáním hodnoty do ''okýnka'' a následovné potvrzení zatím jsem to ''zprovoznil'' když arduino byl server ale ... kod byl napsany :

Kód: Vybrať všetko

 if(readString.indexOf("pwm4?set=0") >0)
            {
            analogWrite(4, 0);    
         }
            if(readString.indexOf("pwm4?set=1") >0)
            {
            analogWrite(4, 25);    
         }
            if(readString.indexOf("pwm4?set=2") >0)
            {
              analogWrite(4, 51);    
          }
atd. To se mi nezdá jako nejlepší řešení (když se představím, že budu potřebovat ovládat 360° servo, a vypisovat takhle každý řádek ...) určitě to jde i jinak něco jako 2 proměnné 1 bude určovat pin a druhá hodnotu jenže jak na to ? A Už vůbec nevím jak bych to mohl udělat s klientem. Dále odesílání dat z analogových vstupů u serveru mi to je jasné s tím problém nemám ale zase ten klient jediné co mě napadá je tohle: načíst hodnoty z analogových pinů ty poslat do nějakého txt souboru soubor uložit a dále server bude pak z tohodle souboru číst. Pokud by jste měli nějaké nápady nebo nějaký jednoduchý skeč jak bych to mohl udělat budu nesmírně vděčný dekuji.
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 08 Máj 2015, 23:41

Kód: Vybrať všetko

http://ip:port/?pwm=XXX
Budes to mat lahsie ak tie cisla budu mat fixnu dlzku 1 pwm=001; 48 pwm=048; 280 pwm=280; vzdy mas 3 znaky
pokial chces mat viac tak 4-5 znakov podla potreby zaklad je fixna dlzka inak musis hladat koniec cisla

Kód: Vybrať všetko

zacatek = readString.indexOf("pwm=") 
zacatek je index v poli znakov a ukazuje zaciatok substr pripocitas celu dlzku retazca "pwm=" a tam zacinaju cisla
tie znaky skonvertujes na cislo (ascii to integer ) napriklad funkcia atoi() da sa aj inak.
aby si dostal uhol 0-360 do rozsahu 0 - 1024 pouzijes map() - dokumentacia
Webserver request napísal:GET http:/ /mojrouter.dyndns.com:5000?pwm=090 HTTP/1.1
Takto nejako by mohol vyzerat GET request na arduino-eth potom spracovanie premmenej robis takto.....

Kód: Vybrať všetko

char buff[4];
int hodnota // int  char cokolvek numericke podla potreby
if (zacatek) { // len ak v requeste je nasiel retazec "&pwm=" 
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
buff[0] = url_buff[zacatek+5]; // "0" - prvy znak 
buff[1] = url_buff[zacatek+6]; // "9" - druhy znak
buff[2] = url_buff[zacatek+7]; // "0" - treti znak
buff[3] = 0x00; // musis retazec ukoncit NULL charom (0x00) inak by to padlo
hodnota = atoi(buff);
}
else {
// ak to tam nieje treba nastavit premmenu hodnota na nejaku default hodnotu
// napriklad nula a servo sa nezmeni
hodnota = 0;
}

servo.otoc(hodnota)
//alebo 
AnalogWrite (4,map(hodnota,0,360,0,1024));
neber to ako hotovy kod skor navod ako nato urcite su tam chyby..
je neskoro hadam je to to co si chcel zbytok necham niekomu inemu
Zdrojak nema ziadne optimalizacie tak sa skusenejsi neukajajte ze to viete VZDY lepsie zadavatel je zaciatocnik
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 09 Máj 2015, 17:40

Koukám na to a snažím se to pochopit, ale nechápu toto:

Kód: Vybrať všetko

if (zacatek) { // len ak v requeste je nasiel retazec "&pwm=" 
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
buff[0] = url_buff[zacatek+5]; // "0" - prvy znak 
buff[1] = url_buff[zacatek+6]; // "9" - druhy znak
buff[2] = url_buff[zacatek+7]; // "0" - treti znak
buff[3] = 0x00; // musis retazec ukoncit NULL charom (0x00) inak by to padlo
hodnota = atoi(buff);
}
s tím buff jsem nikdy nepracoval to je nějaký druh proměnné ? K proměnné začátek přičítáš +5 +6 a +7 proč ? ten buff[3] = 0x00; to jsem pochopil, že je zakončení že to tam musí být.
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 09 Máj 2015, 18:05

Kód: Vybrať všetko

char buff[4]; 

Je to definicia premmenej typu pole znakov o dlzke 5znakov nakolko pole sa indexuje od cisla nula (0,1,2,3,4)

zacatek = readString.indexOf("pwm=") ti vrati kde v poli sa zacina hladany retazec tj. "pwm="
url_buff[zacatek] -> je potom na pismenku "pwm="

ak chces to co je zanim musis to preskocit cize pripocitat dlzku toho hladaneho retazca.
potom ukladas jednotlive znaky do pomocneho pola buff[] ktore potom predas ako parameter atoi()
nieje to najefektivnejsie chcel som aby to bolo lahko citatelne ale vidim ze to nestacilo.

ja som vnoci prepisoval to hladanie povodne tam bolo &pwm= zmenil som to iba na "pwm=" a ten posun
teraz nesedi... asi by to malo byt zacatek+4, +5, +6 tam by malo byt cislo za znakom rovnasa.

dovod preco som vyhodil ten "&" znak je ten ze casom mozes mat viac parametrov alebo len jeden
a vtedy to nema "&" znak a je to hned za otaznikom v URL tak preto hladam iba "pwm="

Pokial nevies ako sa pracuje s polom tak odporucam knizku ktoru si kupil aj boraicho myslim :)
pole je zaklad a pokial to nechapes budes velmi laborovat lebo nemas ako debugovat
jedine co mozes spravit skusit - tam pochopis co vlastne robis.

Kód: Vybrať všetko

Serial.print("hodnota v adrese: ");
Serial.print(url_request[zacatek+4]);
serial.print(url_request[zacatek+5]);
serial.print(url_request[zacatek+6]+'\n');
0
Naposledy upravil/-a dxr v 09 Máj 2015, 18:20, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 09 Máj 2015, 18:17

No já jsem začátečník a "programování" se učím sám, sem tam něco chápu. aháá takže ten začátek + 5 +6 +7 to je znak který z linku arduino má přečíst.

Ještě:
hodnota = atoi(buff); znaky které se uloží do daných buff se budou nakonec v tom atoi(buff) řadit vzestupně ?
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 09 Máj 2015, 18:21

To ze si zaciatocnik vieme ;) preto som sa to pokusal napisat aj s komentarom a co najkratsie
skus si pozriet a potom sa opytaj co ti tam nieje jasne pripadne skus hladat C atoi function example.
http://ftp.tuwien.ac.at/languages/c/pro ... /c_068.htm
http://forum.arduino.cc/index.php?topic=100803.0

ale aj ja som studoval :) lepsie ako hokej... dalo by sa to napisat aj takto ten string object ma metodu charAt()
cize vrat mi znak na pozicii kedze zacatek ukazuje na zaciatok "pwm=" + 4 si za rovnasa prvy znak ktory chces
a potom sa uz len posuvas +1 je druhy +2 je treti znak tie ulozis do pomocneho pola buff[] a funkcii atoi()
mojeduino.domena.cz:8000?pwm=280

Kód: Vybrať všetko

zacatek   = readString.indexOf("pwm=");
buff[0]   = readString.charAt(zacatek+4);   // cislo "2"
buff[1]   = readString.charAt(zacatek+4+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+4+2); // cislo "0"
pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla

// predtym som pouzil premmenu [i]hodnota[/i] ten nazov mohol byt zavazdajuci
// map(.....) ako som pisal vyssie... 

Serial.print("Poslal si cislo: ");
Serial.println(pwm_cislo); // vypise cislo 280 ak je vsetko ok.
Teraz by to mohlo byt uz jasnejsie
]
/* prva verzia ide on off blika dxr */ #include <EtherCard.h> #define TCP_FLAGS_FIN_V 1 //as declared in net.h #define TCP_FLAGS_ACK_V 0x10 //as declared in net.h static byte myip[] = { 192,168,66,5 }; static byte gwip[] = { 192,168,66,1 }; static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x39 }; byte Ethernet::buffer[900]; // tcp ip send and receive buffer const char pageA[] PROGMEM = "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "\r\n" "<html>" "<head><title>" "multipackets Test" "</title></head>" "<body>" "<a href='/'>Start here</a><br>" "<h3>packet 1</h3>" "<p><em>" "the first packet send " "</em></p>" ; const char pageB[] PROGMEM = "<h3>packet 2</h3>" "<p><em>" "if you read this it mean it works" "</em></p>" ; const char pageC[] PROGMEM = "<h3>packet 3</h3>" "<p><em>" "if you read this it mean it works" "</em></p>" ; const char pageD[] PROGMEM = "<h3>packet 4</h3>" "<p><em>" "if you read this it mean it works" "</em></p>" ; const char pageE[] PROGMEM = "<h3>packet 5</h3>" "<p><em>" "this is the last packet" "</em></p>" ; void setup(){ Serial.begin(57600); Serial.println("\n[backSoon]"); pinMode(2,OUTPUT); // ktory port pozri... if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); ether.staticSetup(myip, gwip); Serial.println("\n[backSoon]"); ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); } void loop(){ #define LEDpin 2 #define LEDon digitalWrite(LEDpin, HIGH); delay(250); digitalWrite(LEDpin, LOW) #define LEDoff digitalWrite(LEDpin, HIGH); delay(250); digitalWrite(LEDpin, LOW);delay(250); digitalWrite(LEDpin, HIGH); delay(250); digitalWrite(LEDpin, LOW) word pos = ether.packetLoop(ether.packetReceive()); // check if valid tcp data is received if (pos) { Serial.print("\n\ prisly data size :");Serial.println(pos,DEC); char* data = (char *) Ethernet::buffer + pos; Serial.print("\n\---packetdump---\n ");Serial.print(data);Serial.println("---packetdump---END"); if (strncmp("GET /", data, 5) == 0) { if (strncmp("GET /on", data, 7) == 0) { Serial.println("zapinam ledku"); LEDon; } if (strncmp("GET /off", data, 8 /* */ ) == 0) { Serial.println("vypinam ledku"); LEDoff; } // ak je ether.httpServerReplyAck(); // send ack to the request memcpy_P(ether.tcpOffset(), pageA, sizeof pageA); // send first packet and not send the terminate flag ether.httpServerReply_with_flags(sizeof pageA - 1,TCP_FLAGS_ACK_V); memcpy_P(ether.tcpOffset(), pageB, sizeof pageB); // send second packet and not send the terminate flag ether.httpServerReply_with_flags(sizeof pageB - 1,TCP_FLAGS_ACK_V); memcpy_P(ether.tcpOffset(), pageC, sizeof pageC); // send thirdt packet and not send the terminate flag ether.httpServerReply_with_flags(sizeof pageC - 1,TCP_FLAGS_ACK_V); memcpy_P(ether.tcpOffset(), pageD, sizeof pageD); // send fourth packet and not send the terminate flag ether.httpServerReply_with_flags(sizeof pageD - 1,TCP_FLAGS_ACK_V); memcpy_P(ether.tcpOffset(), pageE, sizeof pageE); // send fiveth packet and send the terminate flag ether.httpServerReply_with_flags(sizeof pageE - 1,TCP_FLAGS_ACK_V|TCP_FLAGS_FIN_V); } else { ether.httpServerReplyAck(); // send ack to the request memcpy_P(ether.tcpOffset(), pageA, sizeof pageA);//only the first part will sended ether.httpServerReply_with_flags(sizeof pageA - 1,TCP_FLAGS_ACK_V|TCP_FLAGS_FIN_V); } } } /* spojenie musi obsahovat * ether.httpServerReplyAck(); // send ack to the request * memcpy_P(ether.tcpOffset(), pageA, sizeof pageA); // send first packet and not send the terminate flag * ether.httpServerReply_with_flags(sizeof pageA - 1,TCP_FLAGS_ACK_V); * ..... * .... something or more packets. * memcpy_P(ether.tcpOffset(), pageE, sizeof pageE); // send fiveth packet and send the terminate flag ether.httpServerReply_with_flags(sizeof pageE - 1,TCP_FLAGS_ACK_V|TCP_FLAGS_FIN_V); } LAST packet need FIN_V flag end */
0
Naposledy upravil/-a dxr v 21 Jún 2015, 20:10, upravené celkom 9 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 09 Máj 2015, 18:27

Ok ok, jdu laborovat a číst. Jak budu mít něco nového ozvu se :) zatím děkuji. I když nejspíš tomu nebudeš věřít celkem hodně si mi to osvětlil a pomohl :).

-- 09 Máj 2015, 19:13 --
dxr napísal:
mojeduino.domena.cz:8000?pwm=280

Kód: Vybrať všetko

zacatek   = readString.indexOf("pwm=");
buff[0]   = readString.charAt(zacatek+4);   // cislo "2"
buff[1]   = readString.charAt(zacatek+4+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+4+2); // cislo "0"
pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla

// predtym som pouzil premmenu [i]hodnota[/i] ten nazov mohol byt zavazdajuci
// map(.....) ako som pisal vyssie... 

Serial.print("Poslal si cislo: ");
Serial.println(pwm_cislo); // vypise cislo 280 ak je vsetko ok.
nemelo by tam být 5, 5+1, 5+2 ? s tou 4kou to přečte "=28" ne ?
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 09 Máj 2015, 20:00

pisal som ze su tam chyby mas hlavu pouzi ju :)
niektore chyby robim omylom a niektore naschval aby tie snippety/sketch-e=fuj nazov ludia nekopirovali len tak
preto si tam mal ten serial.print aby si videl co to spravilo a pohral sa indexami pola.

pridaj na zaciatok programu tento riadok

Kód: Vybrať všetko

 #include <ctype.h>
mozes pouzit funkciu isdigit()

aby som nemusel definovat novu premmenu tak pouzijem pwm_cislo na 2 ulohy overenie ci 3 znaky su cisla
a potom ak su tak tam ulozime prevedeny retazec znakov/string na decimalne cislo
ak je problem bude tam ZLA_HODNOTA a to mozes spracovat dalej v programe.

Kód: Vybrať všetko


#define ZLA_HODNOTA 0x0 (ak je int 16bitovy ak 8bit treba inu hodnotu)
pwm_cislo = 0; // musime nastavit nulu lebo budeme inkrementovat/ zvysovat
if  (isdigit(buff[0])) pwm_cislo++;
if  (isdigit(buff[1])) pwm_cislo++;
if  (isdigit(buff[2])) pwm_cislo++;

if (pwm_cislo == 3) { 
// pwm_cislo bude presne 3 ak su 3 znaky v buffery cisla ak niesu tak to nebude 3
// atoi funkcia nesmie dostat ine ako znaky 0..9 a znamienko inak to neskonvertuje 
// takto sme ju ochranili a vyriesili sme problem co to spravi ked tam bude somarina
pwm_cislo = atoi(buff); 
}
else {
// ak to nieje 3 - neboli vsetky znaky cislo proste nastalal chyba
// tak nastavime specialnu hodnotu aby sme vedeli ze prisla zla hodnota
pwm_cislo = ZLA_HODNOTA; // to je 65535 alebo tam daj nulu ak ti to nevadi....
}
potom mozes testovat

Kód: Vybrať všetko

if (pwm_cislo <> ZLA_HODNOTA) { 
// ak to nieje ZLA_HODNOTA tak sprav nieco so servo-om inak nespravi nic
map(....) 
servo.move(....) alebo nieco take....
}
mahel kde si ty uz #define makro poznas doverne by si mu mohol trosku pomoct

update - zmena 16bitovej 0xFFFF na 0 lebo on take cislo neptorebuje.
0
Naposledy upravil/-a dxr v 16 Máj 2015, 17:55, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 10 Máj 2015, 23:48

Tak jsem to zkoušel dát nějak dokupy. když jsem do Arduina hodil tohle

Kód: Vybrať všetko

buff[0] = url_buff[zacatek+5]; // "0" - prvy znak 
buff[1] = url_buff[zacatek+6]; // "9" - druhy znak
buff[2] = url_buff[zacatek+7]; // "0" - treti znak
tak mi to vypsalo, že url_buff není deklarovaný tak jsem vyzkoušel napsat na začátku programu int url_buff ale to je asi blbost protože mi to stejně nepomohlo a vypsalo mi to že inteeger není validní. Vyzkoušel jsem tedy toto, ale taky to nefunguje.

Kód: Vybrať všetko

buff[0]   = readString.charAt(zacatek+4);   // cislo "2"
buff[1]   = readString.charAt(zacatek+4+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+4+2); // cislo "0"
Tady je zatim to co jsem dal dohromady omlouvám se že to není přehledné mám to poskládané z několika kódů.

Kód: Vybrať všetko

#include <SPI.h>
#include <Ethernet.h>

int zacatek;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xE0 }; 
byte ip[] = { 192, 168, 1, 86 };              
byte gateway[] = { 192, 168, 1, 1 };         
byte subnet[] = { 255, 255, 255, 0 };             
EthernetServer server(80);            
String readString;


void setup(){  
  
pinMode(5, OUTPUT); 

  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
 




char buff[4];
int pwm_cislo; // int  char cokolvek numericke podla potreby
if (zacatek) 
{ // len ak v requeste je nasiel retazec "&pwm=" 
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
zacatek   = readString.indexOf("pwm4?set=");
buff[0]   = readString.charAt(zacatek+10);   // cislo "2"
buff[1]   = readString.charAt(zacatek+10+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+10+2); // cislo "0"
buff[3] = 0x00; // musis retazec ukoncit NULL charom (0x00) inak by to padlo
pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla
}
else {
// ak to tam nieje treba nastavit premmenu hodnota na nejaku default hodnotu
// napriklad nula a servo sa nezmeni
pwm_cislo = 0;
}

//alebo 
analogWrite (5,map(pwm_cislo,0,360,0,1024));

Serial.print("Poslal si cislo: ");
Serial.println(pwm_cislo); // vypise cislo 280 ak je vsetko ok.


}

void loop(){


  EthernetClient client = server.available();
  
   while (client.connected()) {
      if (client.available()) {
        char c = client.read();


        //read char by char HTTP request
        if (readString.length() < 100) {


         //store characters to string
         readString += c;
      //Serial.print(c);


        }


       

        if (c == '\n') {

          Serial.println(readString); 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<HTML>");
          client.println("<HEAD>");

  /*        
   
          

          client.print("</style>");  
          client.print("            <style>");
          client.print("	input[type='range'] {");
          client.print("		-webkit-appearance: none;");
          client.print("		border-radius: 5px;");
          client.print("		box-shadow: inset 0 0 5px #333;");
          client.print("		background-color: #999;"); // Barva Baru
          client.print("		height: 10px;");
          client.print("		vertical-align: middle;");
          client.print("	}");
          client.print("	input[type='range']::-moz-range-track {");
          client.print("		-moz-appearance: none;");
          client.print("		border-radius: 5px;");
          client.print("		box-shadow: inset 0 0 5px #333;");
          client.print("		background-color: #999;");
          client.print("		height: 10px;");
          client.print("	}");
          client.print("	input[type='range']::-webkit-slider-thumb {");
          client.print("		-webkit-appearance: none !important;");
          client.print("		border-radius: 20px;");
          client.print("		background-color: #FFF;");  // Barva slideru
          client.print("		box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("		border: 1px solid #999;");  // Barva okraje slideru
          client.print("		height: 20px;");
          client.print("		width: 20px; ");
          client.print("	}");
          client.print("	input[type='range']::-moz-range-thumb {");
          client.print("		-moz-appearance: none;");
          client.print("		border-radius: 20px;");
          client.print("		background-color: #FFF;");
          client.print("		box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("		border: 1px solid #999;");
          client.print("		height: 20px;");
          client.print("		width: 20px;");
          client.print("	}");
          client.print("</style>");

          client.println("</HEAD>");
          client.println("<body bgcolor=\"#99966\">");
          
          client.println("<hr>");
          client.println("<hr>");    
          client.println("<h1><center>HOME AUTOMATION</h1>");            
          client.println("<hr>");
*/
/////////////////////  PWM Input


            
            client.print("<form method='get'   name='f1' action='pwm4'>");
            client.print("<input type='range' name='set' value='000' min='001' max='254' step='1'");
            client.print("onchange='rangevalue.value=value' onInput='fn1(set.value)' /> ");
            client.print("<output id='rangevalue'></output>");
            client.print("<input type='submit'  id='subm'>");
            client.print("</form>");
 
          client.println("</body>");
          client.println("</HTML>");
          delay(1);

          client.stop();


          readString="";
          


        }
      }
    }
  
}
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 11 Máj 2015, 07:05

No vidis prisiel si na to aj sam a to je dobre chcel si nakopnut nie cely kod :)
Som rad ze si stym nejako pohol a necakal kym dostanes opravenu malickost ako kopa inych.
url_buff som pouzil lebo som z hlavy nevedel ako dostat z tej class-y String znaky. Nepouzivam ju totiz.
S readString sa pracovat ako s polom neda ale treba volat metodu charAt() a na to si prisiel.
Ale toto som si nastudoval az neskor ked som ti tam dopisal buff[0] = charAt() tam som to uz potreboval.


Nenapisal si ci to funguje k spokojnosti :) - hadam budes moct krutit servom na dialku
este nam prezrad co to bude buchanie palickou do zvonceka :)?
Co tak hodit nejaky maly youtube clip co to robi oslovis a motivujes inych nech si nieco spravia..

Osobne by som ten kod upratal tak ze by som kod ktory generuje oddelil od ostatneho kodu funkciou.
Kvoli tomu ze to budes casto este menit aby si si nedopackal uz fungujucu cast vloz to do funkcie.
(ono sa to da vlozit aj do ineho suboru a potom otvorit ako dalsie Arduino IDE okienko a to dost pomaha)

Kód: Vybrať všetko

inline void sendHTML(void) {
        client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<HTML>");
          client.println("<HEAD>");
          .........  skrateny kod
          client.print("<input type='submit'  id='subm'>");
          client.print("</form>");
          client.println("</body>");
          client.println("</HTML>");}
Taky ranny postreh:
Neviem ci je dobry napad pouzivat JS event onchange() skor FORM POST po stlaceni tlacitka.
Takto ked napises "0" sa to posle. Ak je ciel napisat "010" (10stupnov) tak sa najprv posle "0" potom "01" uhol
az potom "010" finalna hodnota. Budu to 4 eventy() zmazanie a natukanie 3 cisiel.(a to je idealny pripad)
Jednoduchu kontrolu vstupu isdigit si nepouzil a to je problem aj ignorovanie dlzky vstupu
toho requestu je potencionalny buffer_overflow. AnalogWrite vtom pripade patri pod atoi naco
zapisovat nulu ak je chyba vstupu?

Ja by som skusil odchytit ENTER (13) a volal tu funkciu co posle data asi takto.

Kód: Vybrať všetko

<script>
    document.getElementById('name').addEventListener('keypress', function(event) {
        if (event.keyCode == 13) {
            tvoja fnc1;
        }
    });
</script>
A nech mi este nejaky Šomrolín povie nieco na arduino a jeho libky. Aj Ultra ASM MCU lowlever developer
by nieco taketo pisal dlhsie a vysledok by musel este dlho ladit. Z pohladu uzivatela/spotrebitela blackbox tester-a
je to rovnaka funkcionalita s moznostou si upravit vsetko a bude to zrat menej ako kopa industrialnych
100x-200x drahsich hotovych produktov. A toto spravil zaciatocnik za jedno poobede....

Poznamka: je tam este vela co vylepsovat ale to uz je na autorovi.... Kurrur posli napajacie napatie a prud pls.
Neprajnici si mozu ..
:butthead: Obrázok
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 11 Máj 2015, 11:57

No právě že mi to nefunguje, ale to bude nejspíše tím JS jak píšeš, ještě to pořeším zkusím vygooglit nějaké slidebary a inspirovat se :). No mám to (možná se ot bude někomu zdát divné) do předzesilvoače, chci ho napojit na router a ovládat hlasitost zapnutí a vypnutí a funkci mute na zesilovači. Ovšem dále to chci použit na domácí automatizaci, ale to je ještě v plenkách každopádně to PWM mi hodně pomůže. Tady mámVIDEO, které jsem dělal před rokem, jak jde vidět otáčení serva jsem udělal pouze přes "tlačítka" s daným úhlem otočení. Aplikaci na android jsem tvořil přes App Inventor je to dobrá věcička a na youtube je k tomu plno návodů. Ten ochranný kod tam určitě použiji jen první bych chtěl rozchodit tu základní část a potom budu přidávat další :) abych se v tom pomaličku začal orientovat a nenasekal tam hned ze začátku plno chyb :). Rád bych ti proměřil napětí a proud která to odebírá, ale bohužel už jsem v UK a bohužel nemám tady multimetr zkusím se tady po něčem podívat a později to proměřit ;) každopádně to napájím přes USB 5V/1A a nepadá to.
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 11 Máj 2015, 20:34

sprav request http://mojrouter.domena.cz:port/?pwm=100 a enter
nerob to cez stranku sprav to takto. mozno si dal vtom JS ip ktora je za routrom :)
JS by mal brat adresu z okna a nemalo by to byt hardcoded v arduine lebo to nebude chodit.
slidebar potrebuje JS a pomerne velky framework odporucam obycajne policko a tlacitko
alebo vela tlacitiek zakladne hodnoty (uhly) takto nejako sa to pekne zmesti do duina
alebo si napisat vlastny slider gzipnut aposlat vedet odhostovat aspon 2 -3 stranky jedna bude html dalsia script.
tretia bude login page.... ale to je uz asi vyssi level :)

mam otazku mas predtymi ledkami nejake odpory? svietia ako dive aky prud nimi preteka ? asi dost velky
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 11 Máj 2015, 21:19

Odpory tam nemám žádné, jelikož to bylo jen na zkoušku samozřejmě pokud by to chtěl někdo provozovat s LED tak určitě s předřadným odporem naměřit a dopočítat předřadný odpor
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 11 Máj 2015, 21:42

Ja som to vedel ze tam niesu ale chcel som to pocut od teba - kratkodobo to znesie ale nerob to.
uvidis to na tom ako sa svab hreje. Este by si mohol napisat aky modul eth pouzivas aby to bolo komplet.
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 11 Máj 2015, 21:54

Jasné jasné to vím, to je jen na zkoušku ;). No je to normální ethernet W5100

-- 16 Máj 2015, 13:52 --

Tak jsem si s tím trošku pohrál, pár chyb jsem opravil ale stále to nefunguje. analogWrite jsem nechal tak aby zapsal jen ty znaky které dostane zatím to testuju jen s led diodou takže dávám hodnoty do 255

Kód: Vybrať všetko

#include <SPI.h>
#include <Ethernet.h>
#include <ctype.h>
#define ZLA_HODNOTA 0xFFFF

int zacatek;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xE0 }; 
byte ip[] = { 192, 168, 1, 86 };                  
byte gateway[] = { 192, 168, 1, 1 };            
byte subnet[] = { 255, 255, 255, 0 };              
EthernetServer server(80);                         
String readString;


void setup(){
pinMode(5, OUTPUT); //PWM

  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);

}


void loop(){
  


  EthernetClient client = server.available();
  
   while (client.connected()) {
      if (client.available()) {
        char c = client.read();


  
        if (readString.length() < 100) {



         readString += c;
  


        }

        if (c == '\n') {

          
          
          


char buff[4];
int pwm_cislo; // int  char cokolvek numericke podla potreby
if (zacatek) 
{ // len ak v requeste je nasiel retazec "&pwm=" 
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
zacatek   = readString.indexOf("set=");
buff[0]   = readString.charAt(zacatek+4);   // cislo "2"
buff[1]   = readString.charAt(zacatek+4+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+4+2); // cislo "0"
buff[3] = 0x00; // musis retazec ukoncit NULL charom (0x00) inak by to padlo

pwm_cislo = 0; // musime nastavit nulu lebo budeme inkrementovat/ zvysovat
if  (isdigit(buff[0])) pwm_cislo++;
if  (isdigit(buff[1])) pwm_cislo++;
if  (isdigit(buff[2])) pwm_cislo++;

if (pwm_cislo == 3) { 
// pwm_cislo bude presne 3 ak su 3 znaky v buffery cisla ak niesu tak to nebude 3
// atoi funkcia nesmie dostat ine ako znaky 0..9 a znamienko inak to neskonvertuje 
// takto sme ju ochranili a vyriesili sme problem co to spravi ked tam bude somarina
pwm_cislo = atoi(buff); 
}
else {
// ak to nieje 3 - neboli vsetky znaky cislo proste nastalal chyba
// tak nastavime specialnu hodnotu aby sme vedeli ze prisla zla hodnota
pwm_cislo == ZLA_HODNOTA; // to je 65535 alebo tam daj nulu ak ti to nevadi....
}


pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla
}
else {
// ak to tam nieje treba nastavit premmenu hodnota na nejaku default hodnotu
// napriklad nula a servo sa nezmeni
//pwm_cislo = 0;
}

analogWrite (5,(pwm_cislo));
Serial.print("Poslal si cislo: ");
Serial.println(pwm_cislo); // vypise cislo 280 ak je vsetko ok.

Serial.println(buff[0]); // vypise cislo 280 ak je vsetko ok.
Serial.println(buff[1]); // vypise cislo 280 ak je vsetko ok.
Serial.println(buff[2]); // vypise cislo 280 ak je vsetko ok.





          Serial.println(readString); 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<HTML>");
          client.println("<HEAD>");

  /*        
   

          client.print("</style>");  
          client.print("            <style>");
          client.print("   input[type='range'] {");
          client.print("      -webkit-appearance: none;");
          client.print("      border-radius: 5px;");
          client.print("      box-shadow: inset 0 0 5px #333;");
          client.print("      background-color: #999;"); // Barva Baru
          client.print("      height: 10px;");
          client.print("      vertical-align: middle;");
          client.print("   }");
          client.print("   input[type='range']::-moz-range-track {");
          client.print("      -moz-appearance: none;");
          client.print("      border-radius: 5px;");
          client.print("      box-shadow: inset 0 0 5px #333;");
          client.print("      background-color: #999;");
          client.print("      height: 10px;");
          client.print("   }");
          client.print("   input[type='range']::-webkit-slider-thumb {");
          client.print("      -webkit-appearance: none !important;");
          client.print("      border-radius: 20px;");
          client.print("      background-color: #FFF;");  // Barva slideru
          client.print("      box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("      border: 1px solid #999;");  // Barva okraje slideru
          client.print("      height: 20px;");
          client.print("      width: 20px; ");
          client.print("   }");
          client.print("   input[type='range']::-moz-range-thumb {");
          client.print("      -moz-appearance: none;");
          client.print("      border-radius: 20px;");
          client.print("      background-color: #FFF;");
          client.print("      box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("      border: 1px solid #999;");
          client.print("      height: 20px;");
          client.print("      width: 20px;");
          client.print("   }");
          client.print("</style>");

          client.println("</HEAD>");
          client.println("<body bgcolor=\"#99966\">");
          
          client.println("<hr>");
          client.println("<hr>");    
          client.println("<h1><center>HOME AUTOMATION</h1>");            
          client.println("<hr>");
*/

  client.print("<form action='slider' method='get'>");
  client.print("<input type='range' min='1' max='9' step='1' name='value'/>");
  client.print("<input type='submit' />");
  client.print("</form>");

    
                        

          client.println("</body>");
          client.println("</HTML>");
          delay(1);

          client.stop();


          readString="";
          


        }
      }
    }
  
}
Vypisuje mi to tohle ať tam zadám jakoukoli hodnotu:

Kód: Vybrať všetko

Poslal si cislo: 106

�

GET /set=009 HTTP/1.1

Poslal si cislo: 106

�

GET /favicon.ico HTTP/1.1
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 16 Máj 2015, 14:51

vysvetli ludom preco si urobil taketo zmeny.

Kurrur posvojom napísal:int pwm_cislo; // int char cokolvek numericke podla potreby
if (zacatek) :?: :?: :idea:
{ // len ak v requeste je nasiel retazec "&pwm="
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
zacatek = readString.indexOf("set=");:?: :?: :?: :?:
buff[0] = readString.charAt(zacatek+4); // cislo "2"
buff[1] = readString.charAt(zacatek+4+1); // cislo "8"
buff[2] = readString.charAt(zacatek+4+2); // cislo "0"
buff[3] = 0
oranzove pismo len zvyraznuje miesta ktore neviem preco su take ake su... proste doKurr.ene..
dalsie pikosky su v code bloku kto najde tak si navodi urologicku pohromu.

Kód: Vybrať všetko

if (pwm_cislo == 3) { 
// pwm_cislo bude presne 3 ak su 3 znaky v buffery cisla ak niesu tak to nebude 3
// atoi funkcia nesmie dostat ine ako znaky 0..9 a znamienko inak to neskonvertuje 
// takto sme ju ochranili a vyriesili sme problem co to spravi ked tam bude somarina
pwm_cislo = atoi(buff); 
}
else {
// ak to nieje 3 - neboli vsetky znaky cislo proste nastalal chyba
// tak nastavime specialnu hodnotu aby sme vedeli ze prisla zla hodnota
pwm_cislo == ZLA_HODNOTA; // to je 65535 alebo tam daj nulu ak ti to nevadi....
}


pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla

Kód: Vybrať všetko

pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla
}
else {
// ak to tam nieje treba nastavit premmenu hodnota na nejaku default hodnotu
// napriklad nula a servo sa nezmeni
//pwm_cislo = 0;
}

analogWrite (5,(pwm_cislo));
Nechaj si to naprogramovat za prachy alebo si kup knizku. Pripadne zmaz to cele a zacni znova a pod kazdy
riadok si daj svoj komentar aby sme videli ze ci chapes co ten kod robi takyto kod potom ma cenu opravit tento zahodit.
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 16 Máj 2015, 17:30

dxr napísal:oranzove pismo len zvyraznuje miesta ktore neviem preco su take ake su... proste doKurr.ene..
nic proti ale to si mi poradil ty sám ;). Na začátku jsem říkal že jsem začátečník odpovědl jsi mi že to víš. No já se s tím tedy nějak potrápím sám popřípadě oslovím na jiném fóru ;) děkuji za čas a ochotu.
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 16 Máj 2015, 17:48

Pozri na prispevok "od dxr » 09 Máj 2015, 18:21" - ako som to napisal ja??????!?!!!???
podla mna je to inak uz len poradie je ine a to poradie ma svoju logiku. nepusti do vstupu co tam nepatri.
TEBE TAM chyba toto zacatek = readString.indexOf("pwm=");
// uz v prvom prispevku si to mal spravne - preco to mas v tom poslednom zle netusim ja som to tak nepisal.
buff[0] = readString.charAt(zacatek+4); // cislo "2"
buff[1] = readString.charAt(zacatek+4+1); // cislo "8"
buff[2] = readString.charAt(zacatek+4+2); // cislo "0"
pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla
if (zacatek) { .............. } Urcite som mal podmienku za indexOf/hladanim nie opacne ako ty.
odkial bude "zacatek" mat spravnu hodnotu ked indexOf mas az za nim???? toto musi vediet aj zaciatocnik
to nieje o programovani ale logicka uvaha...
Nehrozi ze by som dal premmenu do podmienky bez toho aby som ju predtym neinicializoval.
To som fakt nespravil. Ja som to popisoval aha tu

Zakomentoval si - pripad ked sa ma priradit hodnota ak je zly vstup.
Stav ked nemozes robit atoi() niesu cisla ale ine znaky v buff to tam nieje pre srandu.
Toto som spravil tiez JA ?????

Kód: Vybrať všetko

//pwm_cislo = 0;
Nula sa ti pravdepodobne nehodila tak si tam pridal dalsi atoi()

Kód: Vybrať všetko

pwm_cislo = atoi(buff);
ktory je mimo podmienky a bez kontroly vstupu znakov. Ja som to mal v podmienke nie zanou a 2x


Rozdiel medzi "=" a "==" toto musi vediet zaciatocnik prirad a porovnaj sorry. inak sa do ETH projektu nepustat.
Ostat pri blikani a pokial nejde syntax tak toto nerobit... co potom pri pointroch budes robit.

Kód: Vybrať všetko

pwm_cislo == ZLA_HODNOTA; // to je 65535 alebo tam daj nulu ak ti to nevadi....
hladas tam set= ale mas premmenu pwm_cislo - to som tiez spravil ja ? a kopa ineho...

Kód: Vybrať všetko

if (zacatek) 
{ // len ak v requeste je nasiel retazec "&pwm=" 
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
zacatek   = readString.indexOf("set=");
Nic vzlom ale taketo
chyby som v kode nemal a to nehovodim ze to atoi() tam mas vsade kde si nedostal hodnotu ktoru si cakal
proste si tu funkciu nacpal vsade 3x aby si dostal nejake cislo

ja som tam napisal miniimalne 3x ochrany ktore brania tomu co sa ti stalo ze dostavas NON-PRINTABLE znaky
ty si to uz aj tak zjednodusene kontrolovanie vstupu ktore je nutnost ak davas nieco na SIET vyhodil
alebo odfajcil a potom sa cudujes ze tam nieje to co cakas nie nieje lebo pustis dalej somarinu
a cely kod sa zruti hodnoty ukazuju inde alebo niesu inicializovane alebo ziskaju rozsahy ktore niesu dobre.

Zmaz ten kod a skus to spravit znova od nuly... henten kod sa ani neda opravit....
Kroky:

1) Precitat cely riadok URL requestu
2) dat pozor ci nieje dlhsi ako je dlzka pola aby nepretiekol
3) potom treba pozret ci tam mas parametre tvoje "pwm=" alebo "set="
ak tam je aspon jeden
tak si zoberies vsetko od rovnasa po koniec cisla bud moja fixna dlzka alebo inak
4) ak su znaky ktore maju byt cislo skutocne cislo tj znaky 0..9 na to sluzi isdigit()
ak niesu tak to bud nahradis DEFAULT hodnotou - ja to volam zla alebo nic nespravis ZIADNE atoi()
5) ak su znaky ok tak robis atoi() a updatujes vystup ( ked nebudu spravne neupdatujes ignorujes)
Takto som to napisal teraz si to zlep z tych kuskov kde to bolo dobre.
Mohol by som ti to opravit a napisat cely program ale nechcem chcem aby si to spravil sam a vedel ako na to.
lebo by som nerobil nic ine len pisal taketo veci za inych a nic by sa nenaucili. Preto chcem aby si to napisal znova.
0
Naposledy upravil/-a dxr v 16 Máj 2015, 18:00, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Kurrur
Stály člen
Stály člen
Príspevky: 110
Dátum registrácie: 04 Júl 2011, 00:00
Vek: 33
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa Kurrur » 17 Máj 2015, 17:44

No já to bral z toho tvého prvního příspěvku tam je právě ten if (zacatek){ atd. atd. Moje blbost měl jsem nad tím pořádně zauvažovat, mimochodem nejsem si vědom, že bych to měl nějak rozdílné oproti tomu co jsem tady dával naposledy. Dělal jsme na tom ještě včera do noci. a vylezlo ze mě toto:

Kód: Vybrať všetko

#include <SPI.h>
#include <Ethernet.h>
#include <ctype.h>
int zacatek;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xE0 }; 
byte ip[] = { 192, 168, 1, 86 };              
byte gateway[] = { 192, 168, 1, 1 };         
byte subnet[] = { 255, 255, 255, 0 };             
EthernetServer server(80);            
String readString;


void setup(){  
  
pinMode(5, OUTPUT); 

  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);






}


void loop(){
  
  
 


  EthernetClient client = server.available();
  
   while (client.connected()) {
      if (client.available()) {
        char c = client.read();


        //read char by char HTTP request
        if (readString.length() < 100) {


         //store characters to string
         readString += c;
      //Serial.print(c);


        }

char buff[4];
int pwm_cislo; // int  char cokolvek numericke podla potreby
 // len ak v requeste je nasiel retazec "&pwm="  
// netestujem ci je parameter spravny.... ci je skutocne 3 znaky.. to si dorob
zacatek   = readString.indexOf("pwm=");
buff[0]   = readString.charAt(zacatek+4);   // cislo "2"
buff[1]   = readString.charAt(zacatek+4+1); // cislo "8"
buff[2]   = readString.charAt(zacatek+4+2); // cislo "0"
buff[3] = 0x00; // musis retazec ukoncit NULL charom (0x00) inak by to padlo
pwm_cislo = atoi(buff); // pwm_cislo je integer cize datovy typ pre cisla
if (zacatek)
{

analogWrite (5,(pwm_cislo));
} 
else {
// ak to tam nieje treba nastavit premmenu hodnota na nejaku default hodnotu
// napriklad nula a servo sa nezmeni
pwm_cislo = 0;
}




//alebo 
//analogWrite (5,map(pwm_cislo,0,360,0,1024));

Serial.print("Poslal si cislo: ");
Serial.println(pwm_cislo); // vypise cislo 280 ak je vsetko ok.
Serial.println(zacatek);
       

        if (c == '\n' ) {
         
          

          


       //   Serial.println(readString); 
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<HTML>");
          client.println("<HEAD>");

  /*        
   
          

          client.print("</style>");  
          client.print("            <style>");
          client.print("   input[type='range'] {");
          client.print("      -webkit-appearance: none;");
          client.print("      border-radius: 5px;");
          client.print("      box-shadow: inset 0 0 5px #333;");
          client.print("      background-color: #999;"); // Barva Baru
          client.print("      height: 10px;");
          client.print("      vertical-align: middle;");
          client.print("   }");
          client.print("   input[type='range']::-moz-range-track {");
          client.print("      -moz-appearance: none;");
          client.print("      border-radius: 5px;");
          client.print("      box-shadow: inset 0 0 5px #333;");
          client.print("      background-color: #999;");
          client.print("      height: 10px;");
          client.print("   }");
          client.print("   input[type='range']::-webkit-slider-thumb {");
          client.print("      -webkit-appearance: none !important;");
          client.print("      border-radius: 20px;");
          client.print("      background-color: #FFF;");  // Barva slideru
          client.print("      box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("      border: 1px solid #999;");  // Barva okraje slideru
          client.print("      height: 20px;");
          client.print("      width: 20px; ");
          client.print("   }");
          client.print("   input[type='range']::-moz-range-thumb {");
          client.print("      -moz-appearance: none;");
          client.print("      border-radius: 20px;");
          client.print("      background-color: #FFF;");
          client.print("      box-shadow:inset 0 0 10px rgba(000,000,000,0.5);");
          client.print("      border: 1px solid #999;");
          client.print("      height: 20px;");
          client.print("      width: 20px;");
          client.print("   }");
          client.print("</style>");

          client.println("</HEAD>");
          client.println("<body bgcolor=\"#99966\">");
          
          client.println("<hr>");
          client.println("<hr>");    
          client.println("<h1><center>HOME AUTOMATION</h1>");            
          client.println("<hr>");
*/
/////////////////////  PWM Input


            
  client.print("<form action=slider method='get'>");
  client.print("<input type='range' min='001' max='100' step='001' name='pwm' />");
  client.print("<input type='submit' />");
  client.print("</form>");

          client.println("</body>");
          client.println("</HTML>");
          delay(1);

          client.stop();


          readString="";
          


        }
      }
    }
  

}
Jako už to reaguje na ta čisla serial monitor mi taky vypisuje čísla z url což jsem rád :). ale Funguje to jen na IE, když to otevřu v chromu tak se mi to rozsvítí a po chvíli zhasne. Jinak díky, ale já nechci aby ten kód za mě někdo napsal ;) neměl bych z toho takový dobrý pocit jako když si to "vytvořím" sám :-)
0

Používateľov profilový obrázok
dxr
Ultimate člen
Ultimate člen
Príspevky: 3968
Dátum registrácie: 05 Aug 2013, 20:21
Bydlisko: V strede nicoho
Kontaktovať používateľa:

Re: Arduino webserver/client

Príspevok od používateľa dxr » 18 Máj 2015, 10:14

Stale chybaju kontroly vstupu. Vypisovat co prislo ako request treba hned este skor ako ho spracovavas
alebo dvakrat. Prvykrat cisty RAW ako prisiel a potom co si nasiel a aky je parameter. (kedze nemas iny debug).

Stale pustas do atoi() neosetreny URL parameter tj. akekolvek znaky za rovna sa. Obcas to pojde obcas zamrzne.
Vobec neriesis ze browser mozes spravit viac typov requestov aj to robi. Chrome si urcite pyta "favicon"
ale moze robit aj ine poziadavky cize riesit vylucne favicon. napr HEAD alebo novsi HTTP/2
ako by si to spravil by nic neriesilo musi to byt inverzna logika. Pustit len to co je validne.

Stale nemas vyriesene co to spravi ak parameter nebudu tri ciselne znaky alebo menej ako 3 cisla zasebou.
Ja som to tam mal jednym vrzom kontrola na cislo a ze su prave tri. bude ti to padat... robit somariny.
Zatial posledna vec kod ktory je komentaroch tam mas na co? Mal si to precistit nie copy-paste :)
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok