• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Web serwer na Arduino Uno
#1
Wink 
Witam Wszystkich w nowym roku  Big Grin
jest to mój pierszy post na forum.
Chciałbym prosić o pomoc w napisaniu kodu. Mianowicie założyłem sobie zbudować taki mini serwer web na arduino uno z shieldem ethernetowym. 
Miałby on wygladać nastęująco: 
1. Mieć dwie karty (strony w przegladarce). 
Pierwsza pokazywałaby stan wejść wyjść adrunio.(to umiem zrobić mam przetestowane i działa) 
Druga strona miałabybyć konfiguracyjna na której mogę odczytać i zmienić adres ip, maskę i bramę mojego webserwera i po wpisaniu hasła i wcisnieciu przycisku zapisać dane do arduino przeładować tak aby można było się już zalogować po nowym adresie IP. ( udało mi się zrobić stronę z polami tekstowymi, po wpisaniu ip i kliknieciu wyslij wysyłam adres do arduino tak potrafię już sparsować dane i wyłuskać adres ip w czterech zmiennych ip_1 do ip_4.

W czym mam problem: 
1. Chciałbym aby po wejsciu na stronę konfiguracji w polach tekstowych już był wpisany adres ip aktualnie ustawiony. Który moge skaswać i wpsiać noway adres i wysłać go do arduino.
2. Nie umiem ustawić pola tekstowego w kolumnie tak aby pola były jedno pod drugim.
3. Nie wiem jak zrobić drugą karte  (stronę) aby przełączać się pomiędzy Stanem wejsć a konfiguracją.
Załączam kod i proszę o pomoc z góry dziękuję.

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

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 100);

EthernetServer server(80);
String readString;
String ip_1;
String ip_2;
String ip_3;
String ip_4;

int poz1;
int poz2;
int poz3;
int poz4;
int poz5;

char test;

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // czekaj na poloczenie serial
  }
  Serial.println("SERWER ARDUINO");

  Ethernet.begin(mac, ip);

  // Sprawdzam połaczenie ethernet
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("BRAK PLYTKI ETHERNET. :(");
    while (true) {
      delay(1); // opóżnienie
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Kabel ethernetowy nie podłączony.");
  }

  // start serwera
  server.begin();
  Serial.print("ADR SERWE ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // nasłuch danych  od klienta
  EthernetClient client = server.available();
  if (client) {
    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) {
          // strona w html
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<head>");
          client.println("<title>SERWER ARDUINO</title>");
          client.println("</head>");
          client.println("<body>");
          client.println("<h1>Konfiguracja</h1>\n<form action=/config method=GET>Adres IP:<input type=text name=ip value=");
          client.println(">\n<br><br>Default GW IP:    <input type=text name=gw value="); 
          client.println(">\n<br><br>Maska Sieci:   <input type=text name=ms value=");
          client.println(">\n<br><br>New password: <input type=password name=np value=");
          client.println(">\n<br><br>Password: <input type=password name=oldp value=");
         
         
         
          client.println(">\n<br><br><br><br><br><input type=submit \"/?offf\" value=Wyslij>");    // działa jako przycisk w przegladarce
          client.println("</body>");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // odczytuje adres ip ze strony www i parsuje go na 4 człony ip_1 do ip_4
    if (readString.length() >1){
    poz1 = readString.indexOf("ip");
    poz2 = readString.indexOf(".");
     
       ip_1 = readString.substring(poz1+3,poz2);
       Serial.println("ADRES IP");
       Serial.print("IP1:");
       Serial.println(ip_1);

       poz3 = readString.indexOf(".",poz2+1);
       ip_2 = readString.substring(poz2+1,poz3);
       Serial.print("IP2:");
       Serial.println(ip_2);

       poz4 = readString.indexOf(".",poz3+1);
       ip_3 = readString.substring(poz3+1,poz4);
       Serial.print("IP3:");
       Serial.println(ip_3);

       poz5 = readString.indexOf("&",poz4+1);
       ip_4 = readString.substring(poz4+1,poz5);
       Serial.print("IP4:");
       Serial.println(ip_4);
    }

 
   
   

    //czysczenie bufora
    readString="";
  }
}
 
Odpowiedź
#2
UNO to zły wybór. Mega328 w UNO ma "aż" 2kB RAM a ramka ETH może mieć "tylko" 1,5kB. Wybierając UNO utrudniasz sobie życie. Jak rozwiążesz jeden problem pojawi się kolejny. Jeśli ETH ma być "po drucie" szukaj uC z min 4kB RAM, niby więc z zapasem Mega2560 wystarczy ale to zły wybór, bo jest droga. Dużo taniej kupisz, dużo lepszy STM32, który można programować z ArduinoIDE.
Jeśli "drut" nie jest wymagany, wybierz ESP, najlepiej 32 ostatecznie 8266.

(01-01-2020, 22:15)tomasz36a napisał(a): 2. Nie umiem ustawić pola tekstowego w kolumnie tak aby pola były jedno pod drugim.
3. Nie wiem jak zrobić drugą karte (stronę) ....
Zacznij od nauki HTML. Bez tego nie da się projektować stron, pomijam kreatory, które niczemu nie służą na uC poza zużywaniem pamięci programu.
 
Odpowiedź
#3
(02-01-2020, 12:14)semi napisał(a): UNO to zły wybór. Mega328 w UNO ma "aż" 2kB RAM a ramka ETH może mieć "tylko" 1,5kB. Wybierając UNO utrudniasz sobie życie. Jak rozwiążesz jeden problem pojawi się kolejny. Jeśli ETH ma być "po drucie" szukaj uC z min 4kB RAM, niby więc z zapasem Mega2560 wystarczy ale to zły wybór, bo jest droga. Dużo taniej kupisz, dużo lepszy STM32, który można programować z ArduinoIDE.
Jeśli "drut" nie jest wymagany, wybierz ESP, najlepiej 32 ostatecznie 8266.

(01-01-2020, 22:15)tomasz36a napisał(a): 2. Nie umiem ustawić pola tekstowego w kolumnie tak aby pola były jedno pod drugim.
3.  Nie wiem jak zrobić drugą karte  (stronę) ....
Zacznij od nauki HTML. Bez tego nie da się projektować stron, pomijam kreatory, które niczemu nie służą na uC poza zużywaniem pamięci programu.
Witam,
dziękuję za informację.
Wezmę to poważnie pod uwagę. Może jesteś w stanie polecić jakś kurs HTML ( próbowałem własnymi siłami ale składna róźni się kursów html z interentu do tej której musiałem użyć aby działała na arduino. Podejrzałem z innych projektów z webserwerem.
Co do mocy obliczeniowej widziałem na youtube filmik w którym autor pozauje zrobiony zegar NTP własnie na webserwerze na uno. Miał również strone konfiguracyjną i główną z zegarem. Wydaje mi się ze przynajmniej w ramach cwiczeń układ da radę.
 
Odpowiedź
#4
Możesz stworzyć stronę w HTML, a następnie przekonwertować ją do wersji Arduino. Na przykład tutaj: http://davidjwatts.com/youtube/esp8266/e...rtHTM.html
Serwis nie musi być przetrzymywany w pamięci Arduino.
Może być w chmurze: https://diyprojects.io/bootstrap-create-...s-esp8266/
Albo na karcie SD: https://github.com/esp8266/Arduino/blob/...Server.ino
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
(02-01-2020, 20:49)Robson Kerman napisał(a): Możesz stworzyć stronę w HTML, a następnie przekonwertować ją do wersji Arduino. Na przykład tutaj: http://davidjwatts.com/youtube/esp8266/e...rtHTM.html
Serwis nie musi być przetrzymywany w pamięci Arduino.
Może być w chmurze: https://diyprojects.io/bootstrap-create-...s-esp8266/
Albo na karcie SD: https://github.com/esp8266/Arduino/blob/...Server.ino
Dziękuję za pomoc.
 
Odpowiedź
#6
- Karty SD na AVR działają koszmarnie wolno.
- Trzymanie serwisu w 'chmurze" zmniejsza niezawodność i komplikuje projekt. Jeśli strona jest na tyle skomplikowana, że nie da się jej zrobić na uC to należy sięgnąć po komputer przemysłowy, RPi lub coś podobnego.

O ile w projekcie nie są potrzebne zaawansowane grafiki, animacje i inne "bajery", bez problemu można zrobić to na uC, trzeba tylko dobrać uC do zadania a nie na siłę do biednego, drogiego, wolnego mega328 dodawać kolejne interfejsy, serwery i inne "cuda" bo dochodzi do paradoksu, gdzie AVR 16MHz, 32k pamięci programu, 2kB RAM odbiera dane z czujnika i z ledwością wysyła do potężnego RPi 4 rdzenie 1,5GHz, 64GB pamięci na karcie SD, 4GB RAM, jakby RPi nie potrafił odczytać danych z czujnika.
 
Odpowiedź
#7
(03-01-2020, 11:31)semi napisał(a): - Karty SD na AVR działają koszmarnie wolno.

Arduino, to nie tylko AVR.

(03-01-2020, 11:31)semi napisał(a): ... a nie na siłę do biednego, drogiego, wolnego mega328 ...

Arduino, to nie tylko Atmega328.

Arduino, daje olbrzymie zaplecze sprzętowe:
Bluepill jest tańszy od UNO.
Sony Spresense jest tańsze od RPI.
A trzymanie strony WWW oraz bazy danych w chmurze i wysyłanie do niej danych z czujników, jest bardzo wygodne i wydajne.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
Autor wyraźnie napisał
Cytat:arduino uno z shieldem ethernetowym.
a tam jest mega328.

Co do "Bluepill " i innych nie AVR, to ich mocy biblioteki arduino nie wykorzystają i funkcja nie skorzysta z DMA a często będzie wisiała na delay czy w pętli czekając na wykonanie jakiejś operacji. Jedyne co się zyskuje to więcej RAM, FLASH ale nie na szybkości a jeśli to niewiele bo "para idzie w gwizdek" - wystarczy przyjżec się bibliotekom. Przykładowo:
- 1-Wire: Zysk tylko taki, że nie są (przeważnie) blokowane przerwania. Funkcja nadal, choćby nie musiała, nie obsługuje transmisji na przerwaniach z wykorzystaniem UART czy choćby timerów.
- WS2812: Zysk jak powyżej. Program "katuje" CPU zamiast użyć DMA + UART/SPI/I2C.
- Wyświetlacze graficzne: Totalna porażka. Zysk 0%! Funkcje nie używają bufora, DMA. Wzrost prędkości praktycznie 0%. Wyniki publikowałem https://www.elektroda.pl/rtvforum/topic3588785.html i nie tylko ja.
Poruszyłem tylko "wierzchołek góry lodowej". Praktycznie wszystkie biblioteki są do przeróbki a jak zacznie się je przerabiać to dochodzi się do wniosku, że lepiej napisać je od nowa - szybciej i lepiej!
Aby skorzystać z możliwości jakie dają lepsze uC niż AVR, trzeba zapomieć o rozwiązaniach stosowanych w arduino.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości