Hi,
Ik ben voor een bepaald project met wat code voor de Arduino aan het stoeien, en het gaat om een ADC printje met een ADS1115 er op.
De Adafruit library voor de ADS1115 heeft niet de mogelijkheid een lagere sample waarde in te stellen.
Wat op zich geen groot probleem is, omdat ik eerder met succes de "AnalogSmooth.h" library gebruikt hebt om netjes te middelen.
Link naar de library
https://github.com/MichaelThessel/arduino-analog-smooth
Deze code is een stukje van wat uiteindelijk nodig is, er zijn twee sensoren een voor het controleren van de Oven temperatuur en de tweede sensor
wil ik van het zelfde type hebben (TMP37 van Analog Devices) en die meet de temperatuur van de spanningsreferentie print die ook in de oven zit.
Na calibratie en goed opgewarmt te zijn, moeten deze twee sensoren de zelfde temperatuur gaan aangeven.
Dit wik ik zo doen om ondermeer de drift enigsins te kunnen meten.
Er komt ook nog een derde sensor in de oven welke de BME280 is, zodat ik drie sensoren met elkaar kan vergelijken.
De code die nu uit de werkende sensor ingang komt "adc0" heeft met een dopje over de TMP37 sensor tegen de tocht en 50x middeling een vrij stabiele uitlezing als ik niet te veel beweeg
De uitlezing heeft een resolutie van 0,0001C.
De ADC is zo ingesteld dat de gain 4x is, dat houd in dat het spanningsbereik +-1,024V is.
De TMP37 Sensor geeft bij 50C een spanning af van rond de +1V.
Bij een oventemperatuur van 45C gebruik ik dus vooi de volle resolutie van de ADC.
Er komt nog een extra sensing bij voor foutsituaties, zodat ik dan de electronica in de oven niet ga koken...
Maar nu lukt het mij niet om de AnalogSmooth library voor twee ingangen van de ADS1115 te gebruiken, dan krijg ik gekke fouten.
Gaarne speek ik jullie deskundigheid aan, om mij te onderwijzen hoe ik deze code werkbaar kan maken.
c code:
#include <Arduino.h>
#include <U8x8lib.h>
#include <Adafruit_ADS1015.h>
#include <AnalogSmooth.h>
// Defaults smooting window size = 10, 100max.
AnalogSmooth as = AnalogSmooth(50);
// moet hier een variatie van bovenstaande regel staan om de smooth functie voor adc1 te kunnen gebruiken?
U8X8_SH1106_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
float smooth_pid;
float smooth_ref;
float pid_float;
float ref_float;
const float VPS = 1.024 / 32768.0; // volts per step geld voor alle ADC ingangen
unsigned int val = 0;
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
void setup(void)
{
Serial.begin(115200);
ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
ads.begin();
u8x8.begin();
u8x8.setPowerSave(0);
}
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
void loop(void)
{
int16_t adc0, adc1;
adc0 = ads.readADC_SingleEnded(0); // Get value PID sensor input
adc1 = ads.readADC_SingleEnded(1); // Get value Reference sensor input
// measure code runtime
unsigned long start = millis();
float smooth_pid = as.smooth(adc0); // Smoothing with window size xx PID Sensor
float smooth_ref = as.smooth(adc1); // Smoothing with window size xx ReferencePrint
pid_float = smooth_pid * VPS; // convert to voltage for pid sensor
ref_float = smooth_ref * VPS; // convert to voltage for reference sensor
Serial.print("Temp PID C = ");
Serial.println(pid_float / 0.02, 4); // Convert to temperature voor de PID controler
Serial.print("Temp Ref C = ");
Serial.println(ref_float/ 0.02, 4); // Convert to temperature voor de referentie print
u8x8.setFont(u8x8_font_victoriabold8_r);
u8x8.setCursor(0, 0);
u8x8.print(pid_float / 0.02, 4); // Plaatst TMP37 sensor waarde van de PID controler in Celsius op het scherm
u8x8.setCursor(0, 4);
u8x8.print(ref_float / 0.02, 4); // Plaatst TMP37 sensor waarde van de Referentie print in Celsius op het scherm
unsigned long end = millis(); // Berekend deel van de code looptijd
unsigned long delta = end - start;
u8x8.setCursor(0, 6);
u8x8.print(delta); // Plaatst code looptijd in millis op het scherm
delay(2);
}
Ik heb dus geen idee of ik de smooth functie meerdere keren kan aanroepen, dus ook voor mijn adc1 ingang.
Kan dit niet, of maak ik fouten in de manier waarop.
Er waren nog wat meer code regels, maar een aantal ben ik kwijt geraakt die niet werkte in het bovenstaande stukje.
Dank alvast,
Bram