HOW TO MAKE REAL-TIME UPDATE ON BROWSER

hi guys, i make a project about water level monitoring real-time.
i managed to make it works, the output is right and accurate, but i want to make the output on the browser real-time too without the page being refreshed.
so the output will update everytime no need to refresh the page and the user just need to access the page once.
so how do i make this? any idea?

thank you. :slight_smile:

this is my currently code :

//JUST LOOK AT MY HTML CODE BELOW
#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
#define trigPin 3
#define echoPin 2

LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
const int chipSelect = 10;
 
byte degree[8] = {
  0b01110,
  0b01010,
  0b01110,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

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

EthernetServer server(80);

void setup()
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  lcd.createChar(1, degree);
  lcd.begin(16, 2);
}

void loop()
{
  
  long duration, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(10); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(100); 
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  EthernetClient client = server.available();
  
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Water Level:");
  lcd.print(distance);
  lcd.print("cm");
  delay(500);
  
  if (client) {
    boolean current_line_is_blank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && current_line_is_blank) {
          // send a standard http response header
           client.println("HTTP/1.1 200 OK");
           client.println("Content-Type: text/html");
           client.println("Connection: keep-alive");
           client.println();
            
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("");
           client.println("</HEAD>");

           client.println("<BODY>");
           client.println("<center>");
           client.println("<H1>Real-time Water Level Monitoring</H1>");
           
           client.println("<div id='time'></div>");                      //THIS IS ONLY DATE AND TIME
           client.println("<div id='time2'></div>");
           client.println("<script type='text/javascript'>");
           client.println("function berdetik()");
           client.println("{var date = new Date();");
           client.println("var tanggal = date.getDate();");
           client.println("var bulan = date.getMonth();");
           client.println("var tahun = date.getFullYear();");
           client.println("var jam = date.getHours();");
           client.println("var menit = date.getMinutes();");
           client.println("var detik = date.getSeconds();");
           client.println("window.document.getElementById('time').innerHTML = 'Date today : ' +tanggal + '/' + (bulan+1) + '/' + tahun;");
           client.println("window.document.getElementById('time2').innerHTML = 'Time right now : ' +jam + ':' + menit + ':' + detik;");
           client.println("setTimeout('berdetik()',1000);}");
           client.println("berdetik();");
           client.println("</script>");
           
           client.println("<hr />");
           client.println("<H3>");           
           client.print(distance);  //THIS IS THE VARIABLE THAT I WANT IT TO BE UPDATED WITHOUT BEING PAGE REFRESHED
           client.print(" cm");
           client.println("</H3>");
           client.println("</center>");
           client.println("
"); 
           client.println("</BODY>");
           client.println("</HTML>");

            delay(1000);
          break;
        }
        if (c == '\n') {
          // we're starting a new line
          current_line_is_blank = true;
        } 
        else if (c != '\r') {
          // we've gotten a character on the current line
          current_line_is_blank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
  delay(500);
}

Have a look here. Part 7 uses AJAX to update only the variable, without loading the whole page.

Jim

thank you so much jim, appreciate your help :slight_smile:

Server code that puts refreshing data in a frame.

// zoomkat's meta refresh data frame test page 5/25/13
// use http://192.168.1.102:84 in your brouser for main page
// http://192.168.1.102:84/data static data page
// http://192.168.1.102:84/datastart meta refresh data page
// for use with W5100 based ethernet shields
// set the refresh rate to 0 for fastest update
// use STOP for single data updates

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

const int analogInPin0 = A0;
const int analogInPin1 = A1;
const int analogInPin2 = A2;
const int analogInPin3 = A3;
const int analogInPin4 = A4;
const int analogInPin5 = A5;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // arduino ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(84); //server port
unsigned long int x=0; //set refresh counter to 0
String readString; 

//////////////////////

void setup(){
  Serial.begin(9600);
    // disable SD SPI if memory card in the uSD slot
  pinMode(4,OUTPUT);
  digitalWrite(4,HIGH);

  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();
  Serial.println("meta refresh data frame test 5/25/13"); // so I can keep track of what is loaded
}

void loop(){
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
         if (readString.length() < 100) {
          readString += c; 
         } 
        //check if HTTP request has ended
        if (c == '\n') {

          //check get atring received
          Serial.println(readString);

          //output HTML data header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //generate data page
          if(readString.indexOf("data") >0) {  //checks for "data" page
            x=x+1; //page upload counter
            client.print("<HTML><HEAD>");
            //meta-refresh page every 1 seconds if "datastart" page
            if(readString.indexOf("datastart") >0) client.print("<meta http-equiv='refresh' content='1'>"); 
            //meta-refresh 0 for fast data
            if(readString.indexOf("datafast") >0) client.print("<meta http-equiv='refresh' content='0'>"); 
            client.print("<title>Zoomkat's meta-refresh test</title></head><BODY>
");
            client.print("page refresh number: ");
            client.print(x); //current refresh count
            client.print("

");
            
              //output the value of each analog input pin
            client.print("analog input0 is: ");
            client.print(analogRead(analogInPin0));
            
            client.print("
analog input1 is: ");
            client.print(analogRead(analogInPin1));
                        
            client.print("
analog input2 is: ");
            client.print(analogRead(analogInPin2));
            
            client.print("
analog input3 is: ");
            client.print(analogRead(analogInPin3));
                                    
            client.print("
analog input4 is: ");
            client.print(analogRead(analogInPin4));
            
            client.print("
analog input5 is: ");
            client.print(analogRead(analogInPin5));
            client.println("
</BODY></HTML>");
           }
          //generate main page with iframe
          else
          {
            client.print("<HTML><HEAD><TITLE>Zoomkat's frame refresh test</TITLE></HEAD>");
            client.print("Zoomkat's Arduino frame meta refresh test 5/25/13");
            client.print("

Arduino analog input data frame:
");
            client.print("&nbsp;&nbsp;<a href='http://192.168.1.102:84/datastart' target='DataBox' title=''yy''>META-REFRESH</a>");
            client.print("&nbsp;&nbsp;&nbsp;&nbsp;<a href='http://192.168.1.102:84/data' target='DataBox' title=''xx''>SINGLE-STOP</a>");
            client.print("&nbsp;&nbsp;&nbsp;&nbsp;<a href='http://192.168.1.102:84/datafast' target='DataBox' title=''zz''>FAST-DATA</a>
");
            client.print("<iframe src='http://192.168.1.102:84/data' width='350' height='250' name='DataBox'>");
            client.print("</iframe>
</HTML>");
          }
          delay(1);
          //stopping client
          client.stop();
          //clearing string for next read
          readString="";
        }
      }
    }
  }
}
1 Like

thanks zoomkat for your reply, but is there any simple way to do this thing? because i don't plan on using any server, i will host this on VPN Network, so an internal code will be enough i think.

jimboza : i have read the tutorial you posted, it's easy to understand and helpful. but it's only for switching, how do i code it on sensor input? i don't understand it well

so so, anyone can solve this?

deckamaha:
so so, anyone can solve this?

because i don't plan on using any server

That doesn't make much sense to me.