Dissolved Oxygen and Temperature using Arduino
Jump to navigation
Jump to search
References
- Walstad Method for Aquariums
- Walstad Method Science
- Ecology of the Planted Aquarium Book
- Walstad Method Tank Guide
Arduino Code - Temperature data
- Code executed using Cron
#!/usr/bin/env python3
# dweet data
import serial
import datetime
import time
import requests
import pandas as pd
import plotly.express as px
count = 0
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
while count < 5:
time.sleep(1)
count += 1
print(f'count is {count}')
if ser.in_waiting > 0:
print("Serial")
line = ser.readline().decode('utf-8').rstrip()
print(line)
#print(f"Data separated using commas {line.split(',')}")
#mylist = line.split(',')
try:
aq_temp = str(line)
except:
aq_temp = 0.0
print(f'temperature is {aq_temp}')
time.sleep(1)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%m-%d %H:%M:%S")
data = ""
data = date_stamp + "," + str(line) + '\n'
print(f'The data is = {data}')
f = open('/home/pi/Aquarium/aquarium_data.txt','a')
f.write(data)
f.close()
print("Data saved")
try:
print("Preparing dweet")
dweet_dict = {}
dweet_dict.update({"aq_temp": str(aq_temp)})
dweet_dict.update({"time": str(date_stamp)})
url = "https://dweet.io/dweet/for/MPPS-Mernda-STEM-aquarium-4?"
x = requests.post(url, json=dweet_dict)
print(x.text)
count = 6
except:
print("Dweet failed")
# check dweet with - https://dweet.io/get/latest/dweet/for/3083-Bundoora-aquarium1
# Step 2: Read the data from the text file into a Pandas DataFrame
data = pd.read_csv('/home/pi/Aquarium/aquarium_data.txt')
# Step 3: Create a Plotly figure with two scatter plots
fig = px.scatter(data, x='datetime', y=['temperature'],
labels={'datetime': 'Date and Time', 'value': 'Temperature (°C)'},
title='Aquarium temperature')
# Step 4: Customize the plot layout
fig.update_layout(xaxis_title='Date and Time', yaxis_title='Temperature (°C)')
# Step 5: Save the plot as an HTML file
fig.write_html('/home/pi/Aquarium/temperature_plot_aquarium.html')
print("Aquarium plot saved as temperature_plot.html")
Arduino Code
- Monitoring temperature and Dissolved Oxygen
- Atlas sensor for Dissolved Oxygen
- Onewire temperature sensor
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define rx 10 //define what pin rx is going to be
#define tx 11 //define what pin tx is going to be
#define ONE_WIRE_BUS 4 // Data wire is conntec to the Arduino digital pin 4
SoftwareSerial myserialDO(rx, tx); //define how the soft serial port is going to work
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature tempSensor(&oneWire);
String inputstring = ""; //a string to hold incoming data from the PC
String sensorstring = ""; //a string to hold the data from the Atlas Scientific product
void setup() { //set up the hardware
Serial.begin(9600); //set baud rate for the hardware serial port_0 to 9600
myserialDO.begin(9600); //set baud rate for the software serial port to 9600
sensorstring.reserve(30); //set aside some bytes for receiving data from Atlas Scientific product
}
void loop() { //here we go...
if (myserialDO.available() > 0) { //if we see that the Atlas Scientific product has sent a character
char inchar = (char)myserialDO.read(); //get the char we just received
if (inchar == '\r') { //if the incoming character is a <CR>
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
tempSensor.requestTemperatures();
float temperatureValue = tempSensor.getTempCByIndex(0);
Serial.print(sensorstring);
Serial.print(",");
Serial.println(String(temperatureValue, 1)); // Print with 1 decimal places
sensorstring = "";
delay(1000); // Delay for stability
}
else {
sensorstring += inchar; //add the char to the var called sensorstring
}
}
}
Python code to read Temp and Dissolved Oxygen data
- Code running constantly in the background
#!/usr/bin/env python3
# dweet data
import serial
import datetime
import time
import requests
import pandas as pd
import plotly.express as px
count = 0
if __name__ == '__main__':
ser = serial.Serial('/dev/ttyUSB1', 9600, timeout=1)
ser.reset_input_buffer()
while True:
count = count + 1
time.sleep(0.1)
if ser.in_waiting > 0:
try:
line = ser.readline().decode('utf-8').rstrip()
except:
line = "0,0"
print(f"Data separated using commas {line.split(',')}")
mylist = line.split(',')
print(f'My list {mylist}')
try:
dissolvedOxygen = float(mylist[0])
temperature = float(mylist[1])
except:
dissolvedOxygen = 0.0
temperature = 0.0
print(f'dissolvedOxygen is {dissolvedOxygen} and temp is {temperature}')
time.sleep(1)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%m-%d %H:%M:%S")
data = ""
data = date_stamp + "," + str(dissolvedOxygen) + "," + str(temperature) + '\n'
print(f'The data is = {data}')
if count > 2000:
f = open('/home/pi/Aquarium/aquarium_DO_temp.txt','a')
f.write(data)
f.close()
print("Data saved")
try:
print("Preparing dweet")
dweet_dict = {}
dweet_dict.update({"dissolvedOx": str(dissolvedOxygen)})
dweet_dict.update({"temp": str(temperature)})
dweet_dict.update({"time": str(date_stamp)})
url = "https://dweet.io/dweet/for/3083-Bundoora-aquarium1?"
x = requests.post(url, json=dweet_dict)
print(x.text)
except:
print("Dweet failed")
count = 0
# check dweet with - https://dweet.io/get/latest/dweet/for/3083-Bundoora-aquarium1
# Step 2: Read the data from the text file into a Pandas DataFrame
data = pd.read_csv('/home/pi/Aquarium/aquarium_DO_temp.txt')
# Step 3: Create a Plotly figure with two scatter plots
fig = px.scatter(data, x='datetime', y=['temperature','dissolvedOxygen'],
labels={'datetime': 'Date and Time', 'value': 'Temperature (°C)'},
title='Aquarium temperature and DO')
# Step 4: Customize the plot layout
fig.update_layout(xaxis_title='Date and Time', yaxis_title='Temperature (°C)')
# Step 5: Save the plot as an HTML file
fig.write_html('/home/pi/Aquarium/temperature_plot_DO_aquarium.html')
print("Aquarium plot saved as temperature_plot.html")
Photos of Walstad aquarium
Plot of water temperature and dissolved oxygen during first week of aquarium establishment
Walstad aquarium heavily planted
Walstad aquarium with sensors to monitor temperature, DO and EC
Python code DO EC temp and Chem
#!/usr/bin/env python3
# dweet data
import serial
import datetime
import time
import requests
import pandas as pd
import plotly.express as px
from water_variables import *
count = 0
conductivity = 0.0
if __name__ == '__main__':
# dissolved oxygen
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
ser.reset_input_buffer()
# conductivity
serEC = serial.Serial('/dev/ttyUSB1', 9600, timeout=1)
serEC.reset_input_buffer()
while True:
count = count + 1
time.sleep(0.1)
if serEC.in_waiting > 0:
time.sleep(0.1)
try:
lineEC = serEC.readline().decode('utf-8').rstrip()
#print(f'line {lineEC}')
except:
lineEC = "0"
try:
conductivity = lineEC
except:
conductivity = 0.0
print(f'Conductivity is {conductivity}')
print(f'pH is {pH}')
print(f'count is {count}')
if ser.in_waiting > 0:
time.sleep(0.1)
try:
line = ser.readline().decode('utf-8').rstrip()
except:
line = "0,0"
#print(f"Data separated using commas {line.split(',')}")
mylist = line.split(',')
#print(f'My list {mylist}')
try:
dissolvedOxygen = float(mylist[0])
temperature = float(mylist[1])
except:
dissolvedOxygen = 0.0
temperature = 0.0
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%m-%d %H:%M:%S")
print(f'dissolvedOxygen - {dissolvedOxygen}, temp - {temperature}, time - {date_stamp}')
print()
time.sleep(0.3)
now = datetime.datetime.now()
date_stamp = now.strftime("%Y-%m-%d %H:%M:%S")
data = ""
data = date_stamp + "," + str(dissolvedOxygen) + "," + str(temperature) + "," + str(conductivity) + "," +\
str(pH) + "," + str(ammonia) + "," + str(nitrite) + "," + \
str(nitrate) + '\n'
#print(f'The data is = {data}')
if count > 3000 and dissolvedOxygen != 0:
f = open('/home/pi/Aquarium/aquarium_DO_EC_temp_chem.txt','a')
f.write(data)
f.close()
print("Data saved")
try:
print("Preparing dweet")
dweet_dict = {}
dweet_dict.update({"disOx": str(dissolvedOxygen)})
dweet_dict.update({"temp": str(temperature)})
dweet_dict.update({"cond": str(conductivity)})
dweet_dict.update({"pH": str(pH)})
dweet_dict.update({"amm": str(ammonia)})
dweet_dict.update({"nitrite": str(nitrite)})
dweet_dict.update({"nitrate": str(nitrate)})
dweet_dict.update({"time": str(date_stamp)})
url = "https://dweet.io/dweet/for/3083-Bundoora-aquarium1?"
#https://dweet.io/get/latest/dweet/for/3083-Bundoora-aquarium1?
x = requests.post(url, json=dweet_dict)
print(x.text)
except:
print("Dweet failed")
count = 0
# check dweet with - https://dweet.io/get/latest/dweet/for/3083-Bundoora-aquarium1
# Step 2: Read the data from the text file into a Pandas DataFrame
data = pd.read_csv('/home/pi/Aquarium/aquarium_DO_EC_temp_chem.txt')
# Step 3: Create a Plotly figure with two scatter plots
fig = px.scatter(data, x='datetime', y=['temperature','dissolvedOxygen'],
labels={'datetime': 'Date and Time', 'value': 'Temperature (°C)'},
title='Aquarium temperature and DO')
# Step 4: Customize the plot layout
fig.update_layout(xaxis_title='Date and Time', yaxis_title='Temperature (°C)')
# Step 5: Save the plot as an HTML file
fig.write_html('/home/pi/Aquarium/temperature_plot_DO_EC_chem_aquarium.html')
print("Aquarium plot saved as temperature_plot.html")
Python code - Chem variables
# water_variables.py file from which variables to be imported
pH = 7.0
ammonia = 0.0
nitrite = 0.25
nitrate = 10.0
Arduino code DO and temperature
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define rx 10 //define what pin rx is going to be
#define tx 11 //define what pin tx is going to be
#define ONE_WIRE_BUS 4 // Data wire is conntec to the Arduino digital pin 4
SoftwareSerial myserialDO(rx, tx); //define how the soft serial port is going to work
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature tempSensor(&oneWire);
String inputstring = ""; //a string to hold incoming data from the PC
String sensorstring = ""; //a string to hold the data from the Atlas Scientific product
void setup() { //set up the hardware
Serial.begin(9600); //set baud rate for the hardware serial port_0 to 9600
myserialDO.begin(9600); //set baud rate for the software serial port to 9600
sensorstring.reserve(30); //set aside some bytes for receiving data from Atlas Scientific product
}
void loop() { //here we go...
if (myserialDO.available() > 0) { //if we see that the Atlas Scientific product has sent a character
char inchar = (char)myserialDO.read(); //get the char we just received
if (inchar == '\r') { //if the incoming character is a <CR>
// Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
tempSensor.requestTemperatures();
float temperatureValue = tempSensor.getTempCByIndex(0);
Serial.print(sensorstring);
Serial.print(",");
Serial.println(String(temperatureValue, 1)); // Print with 1 decimal places
sensorstring = "";
delay(50); // Delay for stability
}
else {
sensorstring += inchar; //add the char to the var called sensorstring
}
delay(50);
}
}
Arduino code EC
//This code was written to be easy to understand.
//Modify this code as you see fit.
//This code will output data to the Arduino serial monitor.
//Type commands into the Arduino serial monitor to control the EC circuit.
//This code was written in the Arduino 2.0 IDE
//This code was last tested 10/2022
#include <SoftwareSerial.h> //we have to include the SoftwareSerial library, or else we can't use it
#define rx 2 //define what pin rx is going to be
#define tx 3 //define what pin tx is going to be
SoftwareSerial myserialEC(rx, tx); //define how the soft serial port is going to work
String inputstring = ""; //a string to hold incoming data from the PC
String sensorstring = ""; //a string to hold the data from the Atlas Scientific product
boolean input_string_complete = false; //have we received all the data from the PC
boolean sensor_string_complete = false; //have we received all the data from the Atlas Scientific product
void setup() { //set up the hardware
Serial.begin(9600);
myserialEC.begin(9600);
delay(500);
inputstring.reserve(10); //set aside some bytes for receiving data from the PC
sensorstring.reserve(30);
myserialEC.println("K,0.1"); //set conductivit probe to K0.1
}
void loop() { //here we go...
if (myserialEC.available() > 0) { //if we see that the Atlas Scientific product has sent a character
char inchar = (char)myserialEC.read(); //get the char we just received
sensorstring += inchar; //add the char to the var called sensorstring
if (inchar == '\r') { //if the incoming character is a <CR>
sensor_string_complete = true; //set the flag
Serial.println(sensorstring); //send that string to the PC's serial monitor
sensorstring = ""; //clear the string
sensor_string_complete = false;
}
}
}