Arduino WebServer for sending data to Python Client (websocket)

Hi everyone,

I am very new to Arduino and I am currently trying to code a webserver using the websocket protocol, such that my Arduino Uno R3 with Ethernet Shield 2 will read the number of pulses coming from a Hall sensor flowmeter (https://uk.rs-online.com/web/p/flow-sensors/5082704/) and will then briefly store that data, such that it could be accessed by a python program, and have this value output every second to a .csv file.

Currently, my arduino code can successfully output the number of pulses coming from the flowmeter using Serial.print(), and the arduino can be successfully pinged from a laptop, but currently, the client does not correctly output this data to a .csv file, despite no errors being produced.

This python code follows a previous example I have used before to interface with other pieces of scientific equipment, so I think the error maybe with the arduino code.

Below is the arduino code

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

int Pulses = 3;          //Arduino digital pin 2 is declared as Pulses
volatile int pulsecount; //Variable to count number of pulses
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {0xA8, 0x61, 0x0A, 0xAE, 0x69, 0x13};
IPAddress ip(198, 162, 1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);



void setup() {
  //Interrupt pin 3 declared as input and pull up resitor is enabled
  pinMode(Pulses, INPUT);
  //Interrupt is attached to pin 3
  //ISR(interuupt service routine) of interrupt is CountPulses
  //Interrupt is activated on HIGH to LOW transition
  attachInterrupt(digitalPinToInterrupt(Pulses), CountPulses, FALLING);
  Serial.begin(9600);  //Starting serial monitor

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}



void loop() {

  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
 
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
  pulsecount = 0;  //Start counting from 0 again
  interrupts();    //Enables interrupt on arduino pin 3
  delay (2000);    //Wait 2 seconds
  noInterrupts();  //Disable the interrupt

  //One second is over now and we have the number of pulses in variable
  //'pulsecount'

  //Calculating the water flow rate in Milli Liters per minute (NEED TO CHANGE)
  float flowRate;
  flowRate = ((pulsecount) / (1420.0)); //flow rate in mL/s
  Serial.print("Flow Rate [mL/s] =");
  Serial.print(flowRate); //Print milli liters per second on serial monitor
  Serial.println();
}

void CountPulses()
{
  pulsecount++; //Increment the variable on every pulse
}

For the sake of completeness, here is the python code too:

#!/usr/bin/python3
import asyncio
import websockets
import socket
import time
import datetime

starttime = time.time() # start value for timed data acquisition

# setup socket 1
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.connect(("198.162.1.177",80))
if True:
    print('Connected')
def acquire():
    data = s1.recv(2048)
    dataline_tmc1 = datetime.datetime.today().isoformat() + "," + str(data) + "," + str(0) + "\n" # format and assemble data line
    file_name_tmc1 = '{:%Y%m%d}'.format(datetime.datetime.today()) + "_flow-test.csv" # generate file name
    with open(file_name_tmc1, "a") as tmc_file1: # append dataline to file
        tmc_file1.write(dataline_tmc1)
        
while True:
   acquire()
   time.sleep(1.0 - ((time.time() - starttime) % 2.0)) # continue every  (2.0 seconds)

s1.close()

Does anyone have any suggestions? Am I missing something simple regarding how I can send the value flowRate to the python client?

Thanks in advance

Hello,
Your sketch is not sending any code to your pc because the part that formats the data is simply missing!
Best regards,
Johi.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.