#include "ads1230.h"
//constructor (no funcionará la libreria hasta usar funcion begin() )
ads1230::ads1230(){
dataPin = 0;
clockPin = 0;
powerPin = 0;
rawData = 0;
m = 1.0f;
b = 0.0f;
weight = 0.0f;
}
//---------------------------------------------------------------------
//funcion que inicializa efectivamente la clase
void ads1230::begin(int _dataPin, int _clockPin, int _powerPin){
dataPin = _dataPin;
clockPin = _clockPin;
powerPin = _powerPin;
pinMode(dataPin, INPUT); delayMicroseconds(1617);
pinMode(clockPin, OUTPUT); delayMicroseconds(1617);
pinMode(powerPin, OUTPUT); delayMicroseconds(1617);
digitalWrite(powerPin, LOW); delayMicroseconds(490);
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1000);
digitalWrite(powerPin, HIGH); delayMicroseconds(490);
delay(1000);
Power_Down_Mode();
Wakeup();
Standby_Mode();
getRawData();
Offset_Calibration();
getRawData();
Standby_Mode_With_Offset_Calibration();
getRawData();
Standby_Mode();
}
//---------------------------------------------------------------------
//espera a que pin se ponga en alto, indicando que hay info disponible
boolean ads1230::dataReady(){
int DOUT_TIMEOUT = 500;
int startTime = millis();
int elapsed = 0;
while (digitalRead(dataPin) && elapsed < DOUT_TIMEOUT)
elapsed = millis() - startTime;
if (elapsed < DOUT_TIMEOUT)
return true;
else
return false;
}
//---------------------------------------------------------------------
//Obtiene los 20 bits sin procesar
int ads1230::getRawData(){
int iAD_Data = 0;
unsigned char i;
digitalWrite(clockPin, LOW); delayMicroseconds(490);
if (!dataReady())
return 0;
for (i = 0; i < 20; i++)
{
digitalWrite(clockPin, HIGH); delayMicroseconds(490);
delay(1);
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1);
iAD_Data = iAD_Data << 1;
if (digitalRead(dataPin))
{
iAD_Data++;
}
}
for (i = 0; i < 4; i++)
{
digitalWrite(clockPin, HIGH); delayMicroseconds(490);
delay(1);
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1);
}
//return (iAD_Data >> 4);
return iAD_Data;
}
//---------------------------------------------------------------------
//Obtiene peso directamente
float ads1230::getWeight(){
weight = (m * (float)getRawData()) + b;
return weight;
}
//---------------------------------------------------------------------
//asigna offset para sumar al valor obtenido de getWeight()
void ads1230::setOffset(float _offset){
b = _offset;
}
//---------------------------------------------------------------------
//añade offset para sumar al valor obtenido de getWeight()
void ads1230::addOffset(float _offset){
b += _offset;
}
//---------------------------------------------------------------------
//Indica offset para restar al valor obtenido de getWeight()
void ads1230::setSlope(float _pendiente){
m = _pendiente;
}
//---------------------------------------------------------------------
//reduce la energia consumida practicamente a 0 pero no permite hacer lecturas
void ads1230::Power_Down_Mode(){
digitalWrite(clockPin, LOW); delayMicroseconds(490);
digitalWrite(powerPin, LOW); delayMicroseconds(490);
delay(1);
}
//---------------------------------------------------------------------
//Despierta al integrado para poder volver a realizar lecturas
void ads1230::Wakeup(){
digitalWrite(clockPin, LOW); delayMicroseconds(490);
digitalWrite(powerPin, HIGH); delayMicroseconds(490);
delay(1);
}
//---------------------------------------------------------------------
//envia al integrado al estado de bajo consumo
boolean ads1230::Standby_Mode(){
unsigned char i;
digitalWrite(clockPin, LOW); delayMicroseconds(490);
if (!dataReady())
return false;
for (i = 0; i < 20; i++)
{
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1);
digitalWrite(clockPin, HIGH); delayMicroseconds(490);
delay(1);
}
delay(50);
return true;
}
//---------------------------------------------------------------------
//remueve el error inherente del ads1230
boolean ads1230::Offset_Calibration(){
unsigned char i;
digitalWrite(clockPin, LOW); delayMicroseconds(490);
if (!dataReady())
return false;
for (i = 0; i < 26; i++)
{
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1);
digitalWrite(clockPin, HIGH); delayMicroseconds(490);
delay(1);
}
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1000);
return true;
}
//---------------------------------------------------------------------
//envia al integrado al estado de bajo consumo, indicandole que se calibre la proxima vez que arranque
boolean ads1230::Standby_Mode_With_Offset_Calibration(){
unsigned char i;
digitalWrite(clockPin, LOW); delayMicroseconds(490);
if (!dataReady())
return false;
for (i = 0; i < 26; i++)
{
digitalWrite(clockPin, LOW); delayMicroseconds(490);
delay(1);
digitalWrite(clockPin, HIGH); delayMicroseconds(490);
delay(1);
}
return true;
}