Hello again. So I have tried to read all the forum search results on this topic but got stuck on the converting values as I am using a very simple code from github. This is an ADS1115 4-20ma converter, 1 channel.
I have tried to find examples on converting the 4-20mA readings to know values of my sensor, and also how to calibrate so I get true 4-20mA instead of a lower number.
For calibration.
I should show a 4 reading as 4mA (for a flow rate of 0 cfm), and 20 as 20mA (for a flow rate of 200 cfm). But what I actually see on my console is a flow of 0 = 3.827mA through 3.93mA and a flow of 200 as 19.67 to 19.678.
How do I enter calibration code to fix this variable and or round it to two decimals, IE 4.00 or 20.00?
For Converting the data.
My flow meter will measure 0 to 200 CFM. So I need to add code that will change the mA values to read and measure the date in between if a flow of 0 = 4mA and flow of 200 CFM = 20mA. Ane everywhere in between.
Thank you in advance for your time. I really tried to find the solution online on all the forums but was unsuccessful.
Here is a screenshot of my particle console. I will post my code for the .ino file and the ads1115.cpp separately.
datalogger.ino :
/*
Project DataLoggerMac
Description: Flow Meter Datta logger application
Author:
Date: 4/28/18
*/
// setup() runs once, when the device is first turned on.
#include "ads1115.h"
ADS1115 inputBoard;
float ma = 0.0;
void setup() {
inputBoard.setAddress(0);
}
void loop() {
//Input 1
int16_t input_1 = inputBoard.readInput(1);
ma = (input_1*4.00)/2130.00;
Serial.printf("Input 1 reading: %f \n", ma);
delay(1000);
Particle.publish("Input 1 reading", String(ma) + " mA"); delay(2000);
}
ads1115.cpp :
#include "ads1115.h"
bool ADS1115::setAddress(int addressJumper){
if(addressJumper == 1){
address = address | 1;
}
}
int ADS1115::readInput(int channel){
// byte writeData[2] = {(byte)readInputSingleEnded[channel -1], (byte)(readInputSingleEnded[channel - 1]>>8)};
if(!wireWrite(address, 0x01, readInputSingleEnded[channel -1], 2)){
Serial.println("WireWrite failed");
}
delay(50);
if(!wireRead(address, 0x00, localReadBuf, 2)){
Serial.println("WireRead failed");
}
uint16_t raw_adc = (localReadBuf[0] << 8) | localReadBuf[1];
return raw_adc;
}
bool ADS1115::wireWrite(int addr, int reg, uint16_t value, int len){
if (!Wire.isEnabled()) {
Wire.begin();
}
Wire.beginTransmission(addr);
Wire.write((uint8_t)reg);
Wire.write((uint8_t)(value>>8));
Wire.write((uint8_t)(value & 0xFF));
byte status = Wire.endTransmission();
if(status == 0){
return true;
}else{
return false;
}
}
bool ADS1115::wireRead(int addr, int reg, int* readBuff, int returnLen){
int buf[returnLen];
if (!Wire.isEnabled()) {
Wire.begin();
}
Wire.beginTransmission(addr);
Wire.write(reg);
byte status = Wire.endTransmission();
if(status != 0){
return false;
}
Wire.requestFrom(addr, returnLen);
unsigned long startTime = millis();
while(Wire.available() != returnLen && millis()<startTime+timeout);
if(Wire.available() != returnLen){
return false;
}
for(int i = 0; i < returnLen; i++){
readBuff[i] = Wire.read();
// Serial.printf("read: %i \n", readBuff[i]);
}
return true;
}