Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Pedro Henrique Kopper
SADAPMAP
Commits
df244490
Commit
df244490
authored
Oct 04, 2018
by
Alisson Claudino
Browse files
ADD: New Firmware code Writen in C++ using pio
parent
7356fb8e
Changes
5
Hide whitespace changes
Inline
Side-by-side
Firmware/lib/Adafruit_ADS1015/Adafruit_ADS1015.cpp
0 → 100644
View file @
df244490
/**************************************************************************/
/*!
@file Adafruit_ADS1015.cpp
@author K.Townsend (Adafruit Industries)
@license BSD (see license.txt)
Driver for the ADS1015/ADS1115 ADC
This is a library for the Adafruit MPL115A2 breakout
----> https://www.adafruit.com/products/???
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
@section HISTORY
v1.0 - First release
*/
/**************************************************************************/
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Wire.h>
#include "Adafruit_ADS1015.h"
/**************************************************************************/
/*!
@brief Abstract away platform differences in Arduino wire library
*/
/**************************************************************************/
static
uint8_t
i2cread
(
void
)
{
#if ARDUINO >= 100
return
Wire
.
read
();
#else
return
Wire
.
receive
();
#endif
}
/**************************************************************************/
/*!
@brief Abstract away platform differences in Arduino wire library
*/
/**************************************************************************/
static
void
i2cwrite
(
uint8_t
x
)
{
#if ARDUINO >= 100
Wire
.
write
((
uint8_t
)
x
);
#else
Wire
.
send
(
x
);
#endif
}
/**************************************************************************/
/*!
@brief Writes 16-bits to the specified destination register
*/
/**************************************************************************/
static
void
writeRegister
(
uint8_t
i2cAddress
,
uint8_t
reg
,
uint16_t
value
)
{
Wire
.
beginTransmission
(
i2cAddress
);
i2cwrite
((
uint8_t
)
reg
);
i2cwrite
((
uint8_t
)(
value
>>
8
));
i2cwrite
((
uint8_t
)(
value
&
0xFF
));
Wire
.
endTransmission
();
}
/**************************************************************************/
/*!
@brief Writes 16-bits to the specified destination register
*/
/**************************************************************************/
static
uint16_t
readRegister
(
uint8_t
i2cAddress
,
uint8_t
reg
)
{
Wire
.
beginTransmission
(
i2cAddress
);
i2cwrite
(
ADS1015_REG_POINTER_CONVERT
);
Wire
.
endTransmission
();
Wire
.
requestFrom
(
i2cAddress
,
(
uint8_t
)
2
);
return
((
i2cread
()
<<
8
)
|
i2cread
());
}
/**************************************************************************/
/*!
@brief Instantiates a new ADS1015 class w/appropriate properties
*/
/**************************************************************************/
Adafruit_ADS1015
::
Adafruit_ADS1015
(
uint8_t
i2cAddress
)
{
m_i2cAddress
=
i2cAddress
;
m_conversionDelay
=
ADS1015_CONVERSIONDELAY
;
m_bitShift
=
4
;
m_gain
=
GAIN_TWOTHIRDS
;
/* +/- 6.144V range (limited to VDD +0.3V max!) */
}
/**************************************************************************/
/*!
@brief Instantiates a new ADS1115 class w/appropriate properties
*/
/**************************************************************************/
Adafruit_ADS1115
::
Adafruit_ADS1115
(
uint8_t
i2cAddress
)
{
m_i2cAddress
=
i2cAddress
;
m_conversionDelay
=
ADS1115_CONVERSIONDELAY
;
m_bitShift
=
0
;
m_gain
=
GAIN_TWOTHIRDS
;
/* +/- 6.144V range (limited to VDD +0.3V max!) */
}
/**************************************************************************/
/*!
@brief Sets up the HW (reads coefficients values, etc.)
*/
/**************************************************************************/
void
Adafruit_ADS1015
::
begin
()
{
Wire
.
begin
();
}
/**************************************************************************/
/*!
@brief Sets the gain and input voltage range
*/
/**************************************************************************/
void
Adafruit_ADS1015
::
setGain
(
adsGain_t
gain
)
{
m_gain
=
gain
;
}
/**************************************************************************/
/*!
@brief Gets a gain and input voltage range
*/
/**************************************************************************/
adsGain_t
Adafruit_ADS1015
::
getGain
()
{
return
m_gain
;
}
/**************************************************************************/
/*!
@brief Gets a single-ended ADC reading from the specified channel
*/
/**************************************************************************/
uint16_t
Adafruit_ADS1015
::
readADC_SingleEnded
(
uint8_t
channel
)
{
if
(
channel
>
3
)
{
return
0
;
}
// Start with default values
uint16_t
config
=
ADS1015_REG_CONFIG_CQUE_NONE
|
// Disable the comparator (default val)
ADS1015_REG_CONFIG_CLAT_NONLAT
|
// Non-latching (default val)
ADS1015_REG_CONFIG_CPOL_ACTVLOW
|
// Alert/Rdy active low (default val)
ADS1015_REG_CONFIG_CMODE_TRAD
|
// Traditional comparator (default val)
ADS1015_REG_CONFIG_DR_1600SPS
|
// 1600 samples per second (default)
ADS1015_REG_CONFIG_MODE_SINGLE
;
// Single-shot mode (default)
// Set PGA/voltage range
config
|=
m_gain
;
// Set single-ended input channel
switch
(
channel
)
{
case
(
0
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_0
;
break
;
case
(
1
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_1
;
break
;
case
(
2
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_2
;
break
;
case
(
3
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_3
;
break
;
}
// Set 'start single-conversion' bit
config
|=
ADS1015_REG_CONFIG_OS_SINGLE
;
// Write config register to the ADC
writeRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONFIG
,
config
);
// Wait for the conversion to complete
delay
(
m_conversionDelay
);
// Read the conversion results
// Shift 12-bit results right 4 bits for the ADS1015
return
readRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONVERT
)
>>
m_bitShift
;
}
/**************************************************************************/
/*!
@brief Reads the conversion results, measuring the voltage
difference between the P (AIN0) and N (AIN1) input. Generates
a signed value since the difference can be either
positive or negative.
*/
/**************************************************************************/
int16_t
Adafruit_ADS1015
::
readADC_Differential_0_1
()
{
// Start with default values
uint16_t
config
=
ADS1015_REG_CONFIG_CQUE_NONE
|
// Disable the comparator (default val)
ADS1015_REG_CONFIG_CLAT_NONLAT
|
// Non-latching (default val)
ADS1015_REG_CONFIG_CPOL_ACTVLOW
|
// Alert/Rdy active low (default val)
ADS1015_REG_CONFIG_CMODE_TRAD
|
// Traditional comparator (default val)
ADS1015_REG_CONFIG_DR_1600SPS
|
// 1600 samples per second (default)
ADS1015_REG_CONFIG_MODE_SINGLE
;
// Single-shot mode (default)
// Set PGA/voltage range
config
|=
m_gain
;
// Set channels
config
|=
ADS1015_REG_CONFIG_MUX_DIFF_0_1
;
// AIN0 = P, AIN1 = N
// Set 'start single-conversion' bit
config
|=
ADS1015_REG_CONFIG_OS_SINGLE
;
// Write config register to the ADC
writeRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONFIG
,
config
);
// Wait for the conversion to complete
delay
(
m_conversionDelay
);
// Read the conversion results
uint16_t
res
=
readRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONVERT
)
>>
m_bitShift
;
if
(
m_bitShift
==
0
)
{
return
(
int16_t
)
res
;
}
else
{
// Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if
(
res
>
0x07FF
)
{
// negative number - extend the sign to 16th bit
res
|=
0xF000
;
}
return
(
int16_t
)
res
;
}
}
/**************************************************************************/
/*!
@brief Reads the conversion results, measuring the voltage
difference between the P (AIN2) and N (AIN3) input. Generates
a signed value since the difference can be either
positive or negative.
*/
/**************************************************************************/
int16_t
Adafruit_ADS1015
::
readADC_Differential_2_3
()
{
// Start with default values
uint16_t
config
=
ADS1015_REG_CONFIG_CQUE_NONE
|
// Disable the comparator (default val)
ADS1015_REG_CONFIG_CLAT_NONLAT
|
// Non-latching (default val)
ADS1015_REG_CONFIG_CPOL_ACTVLOW
|
// Alert/Rdy active low (default val)
ADS1015_REG_CONFIG_CMODE_TRAD
|
// Traditional comparator (default val)
ADS1015_REG_CONFIG_DR_1600SPS
|
// 1600 samples per second (default)
ADS1015_REG_CONFIG_MODE_SINGLE
;
// Single-shot mode (default)
// Set PGA/voltage range
config
|=
m_gain
;
// Set channels
config
|=
ADS1015_REG_CONFIG_MUX_DIFF_2_3
;
// AIN2 = P, AIN3 = N
// Set 'start single-conversion' bit
config
|=
ADS1015_REG_CONFIG_OS_SINGLE
;
// Write config register to the ADC
writeRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONFIG
,
config
);
// Wait for the conversion to complete
delay
(
m_conversionDelay
);
// Read the conversion results
uint16_t
res
=
readRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONVERT
)
>>
m_bitShift
;
if
(
m_bitShift
==
0
)
{
return
(
int16_t
)
res
;
}
else
{
// Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if
(
res
>
0x07FF
)
{
// negative number - extend the sign to 16th bit
res
|=
0xF000
;
}
return
(
int16_t
)
res
;
}
}
/**************************************************************************/
/*!
@brief Sets up the comparator to operate in basic mode, causing the
ALERT/RDY pin to assert (go from high to low) when the ADC
value exceeds the specified threshold.
This will also set the ADC in continuous conversion mode.
*/
/**************************************************************************/
void
Adafruit_ADS1015
::
startComparator_SingleEnded
(
uint8_t
channel
,
int16_t
threshold
)
{
// Start with default values
uint16_t
config
=
ADS1015_REG_CONFIG_CQUE_1CONV
|
// Comparator enabled and asserts on 1 match
ADS1015_REG_CONFIG_CLAT_LATCH
|
// Latching mode
ADS1015_REG_CONFIG_CPOL_ACTVLOW
|
// Alert/Rdy active low (default val)
ADS1015_REG_CONFIG_CMODE_TRAD
|
// Traditional comparator (default val)
ADS1015_REG_CONFIG_DR_1600SPS
|
// 1600 samples per second (default)
ADS1015_REG_CONFIG_MODE_CONTIN
|
// Continuous conversion mode
ADS1015_REG_CONFIG_MODE_CONTIN
;
// Continuous conversion mode
// Set PGA/voltage range
config
|=
m_gain
;
// Set single-ended input channel
switch
(
channel
)
{
case
(
0
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_0
;
break
;
case
(
1
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_1
;
break
;
case
(
2
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_2
;
break
;
case
(
3
):
config
|=
ADS1015_REG_CONFIG_MUX_SINGLE_3
;
break
;
}
// Set the high threshold register
// Shift 12-bit results left 4 bits for the ADS1015
writeRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_HITHRESH
,
threshold
<<
m_bitShift
);
// Write config register to the ADC
writeRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONFIG
,
config
);
}
/**************************************************************************/
/*!
@brief In order to clear the comparator, we need to read the
conversion results. This function reads the last conversion
results without changing the config value.
*/
/**************************************************************************/
int16_t
Adafruit_ADS1015
::
getLastConversionResults
()
{
// Wait for the conversion to complete
delay
(
m_conversionDelay
);
// Read the conversion results
uint16_t
res
=
readRegister
(
m_i2cAddress
,
ADS1015_REG_POINTER_CONVERT
)
>>
m_bitShift
;
if
(
m_bitShift
==
0
)
{
return
(
int16_t
)
res
;
}
else
{
// Shift 12-bit results right 4 bits for the ADS1015,
// making sure we keep the sign bit intact
if
(
res
>
0x07FF
)
{
// negative number - extend the sign to 16th bit
res
|=
0xF000
;
}
return
(
int16_t
)
res
;
}
}
Firmware/lib/Adafruit_ADS1015/Adafruit_ADS1015.h
0 → 100644
View file @
df244490
/**************************************************************************/
/*!
@file Adafruit_ADS1015.h
@author K. Townsend (Adafruit Industries)
@license BSD (see license.txt)
This is a library for the Adafruit ADS1015 breakout board
----> https://www.adafruit.com/products/???
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
@section HISTORY
v1.0 - First release
v1.1 - Added ADS1115 support - W. Earl
*/
/**************************************************************************/
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Wire.h>
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
#define ADS1015_ADDRESS (0x48) // 1001 000 (ADDR = GND)
/*=========================================================================*/
/*=========================================================================
CONVERSION DELAY (in mS)
-----------------------------------------------------------------------*/
#define ADS1015_CONVERSIONDELAY (1)
#define ADS1115_CONVERSIONDELAY (8)
/*=========================================================================*/
/*=========================================================================
POINTER REGISTER
-----------------------------------------------------------------------*/
#define ADS1015_REG_POINTER_MASK (0x03)
#define ADS1015_REG_POINTER_CONVERT (0x00)
#define ADS1015_REG_POINTER_CONFIG (0x01)
#define ADS1015_REG_POINTER_LOWTHRESH (0x02)
#define ADS1015_REG_POINTER_HITHRESH (0x03)
/*=========================================================================*/
/*=========================================================================
CONFIG REGISTER
-----------------------------------------------------------------------*/
#define ADS1015_REG_CONFIG_OS_MASK (0x8000)
#define ADS1015_REG_CONFIG_OS_SINGLE (0x8000) // Write: Set to start a single-conversion
#define ADS1015_REG_CONFIG_OS_BUSY (0x0000) // Read: Bit = 0 when conversion is in progress
#define ADS1015_REG_CONFIG_OS_NOTBUSY (0x8000) // Read: Bit = 1 when device is not performing a conversion
#define ADS1015_REG_CONFIG_MUX_MASK (0x7000)
#define ADS1015_REG_CONFIG_MUX_DIFF_0_1 (0x0000) // Differential P = AIN0, N = AIN1 (default)
#define ADS1015_REG_CONFIG_MUX_DIFF_0_3 (0x1000) // Differential P = AIN0, N = AIN3
#define ADS1015_REG_CONFIG_MUX_DIFF_1_3 (0x2000) // Differential P = AIN1, N = AIN3
#define ADS1015_REG_CONFIG_MUX_DIFF_2_3 (0x3000) // Differential P = AIN2, N = AIN3
#define ADS1015_REG_CONFIG_MUX_SINGLE_0 (0x4000) // Single-ended AIN0
#define ADS1015_REG_CONFIG_MUX_SINGLE_1 (0x5000) // Single-ended AIN1
#define ADS1015_REG_CONFIG_MUX_SINGLE_2 (0x6000) // Single-ended AIN2
#define ADS1015_REG_CONFIG_MUX_SINGLE_3 (0x7000) // Single-ended AIN3
#define ADS1015_REG_CONFIG_PGA_MASK (0x0E00)
#define ADS1015_REG_CONFIG_PGA_6_144V (0x0000) // +/-6.144V range = Gain 2/3
#define ADS1015_REG_CONFIG_PGA_4_096V (0x0200) // +/-4.096V range = Gain 1
#define ADS1015_REG_CONFIG_PGA_2_048V (0x0400) // +/-2.048V range = Gain 2 (default)
#define ADS1015_REG_CONFIG_PGA_1_024V (0x0600) // +/-1.024V range = Gain 4
#define ADS1015_REG_CONFIG_PGA_0_512V (0x0800) // +/-0.512V range = Gain 8
#define ADS1015_REG_CONFIG_PGA_0_256V (0x0A00) // +/-0.256V range = Gain 16
#define ADS1015_REG_CONFIG_MODE_MASK (0x0100)
#define ADS1015_REG_CONFIG_MODE_CONTIN (0x0000) // Continuous conversion mode
#define ADS1015_REG_CONFIG_MODE_SINGLE (0x0100) // Power-down single-shot mode (default)
#define ADS1015_REG_CONFIG_DR_MASK (0x00E0)
#define ADS1015_REG_CONFIG_DR_128SPS (0x0000) // 128 samples per second
#define ADS1015_REG_CONFIG_DR_250SPS (0x0020) // 250 samples per second
#define ADS1015_REG_CONFIG_DR_490SPS (0x0040) // 490 samples per second
#define ADS1015_REG_CONFIG_DR_920SPS (0x0060) // 920 samples per second
#define ADS1015_REG_CONFIG_DR_1600SPS (0x0080) // 1600 samples per second (default)
#define ADS1015_REG_CONFIG_DR_2400SPS (0x00A0) // 2400 samples per second
#define ADS1015_REG_CONFIG_DR_3300SPS (0x00C0) // 3300 samples per second
#define ADS1015_REG_CONFIG_CMODE_MASK (0x0010)
#define ADS1015_REG_CONFIG_CMODE_TRAD (0x0000) // Traditional comparator with hysteresis (default)
#define ADS1015_REG_CONFIG_CMODE_WINDOW (0x0010) // Window comparator
#define ADS1015_REG_CONFIG_CPOL_MASK (0x0008)
#define ADS1015_REG_CONFIG_CPOL_ACTVLOW (0x0000) // ALERT/RDY pin is low when active (default)
#define ADS1015_REG_CONFIG_CPOL_ACTVHI (0x0008) // ALERT/RDY pin is high when active
#define ADS1015_REG_CONFIG_CLAT_MASK (0x0004) // Determines if ALERT/RDY pin latches once asserted
#define ADS1015_REG_CONFIG_CLAT_NONLAT (0x0000) // Non-latching comparator (default)
#define ADS1015_REG_CONFIG_CLAT_LATCH (0x0004) // Latching comparator
#define ADS1015_REG_CONFIG_CQUE_MASK (0x0003)
#define ADS1015_REG_CONFIG_CQUE_1CONV (0x0000) // Assert ALERT/RDY after one conversions
#define ADS1015_REG_CONFIG_CQUE_2CONV (0x0001) // Assert ALERT/RDY after two conversions
#define ADS1015_REG_CONFIG_CQUE_4CONV (0x0002) // Assert ALERT/RDY after four conversions
#define ADS1015_REG_CONFIG_CQUE_NONE (0x0003) // Disable the comparator and put ALERT/RDY in high state (default)
/*=========================================================================*/
typedef
enum
{
GAIN_TWOTHIRDS
=
ADS1015_REG_CONFIG_PGA_6_144V
,
GAIN_ONE
=
ADS1015_REG_CONFIG_PGA_4_096V
,
GAIN_TWO
=
ADS1015_REG_CONFIG_PGA_2_048V
,
GAIN_FOUR
=
ADS1015_REG_CONFIG_PGA_1_024V
,
GAIN_EIGHT
=
ADS1015_REG_CONFIG_PGA_0_512V
,
GAIN_SIXTEEN
=
ADS1015_REG_CONFIG_PGA_0_256V
}
adsGain_t
;
class
Adafruit_ADS1015
{
protected:
// Instance-specific properties
uint8_t
m_i2cAddress
;
uint8_t
m_conversionDelay
;
uint8_t
m_bitShift
;
adsGain_t
m_gain
;
public:
Adafruit_ADS1015
(
uint8_t
i2cAddress
=
ADS1015_ADDRESS
);
void
begin
(
void
);
uint16_t
readADC_SingleEnded
(
uint8_t
channel
);
int16_t
readADC_Differential_0_1
(
void
);
int16_t
readADC_Differential_2_3
(
void
);
void
startComparator_SingleEnded
(
uint8_t
channel
,
int16_t
threshold
);
int16_t
getLastConversionResults
();
void
setGain
(
adsGain_t
gain
);
adsGain_t
getGain
(
void
);
private:
};
// Derive from ADS1105 & override construction to set properties
class
Adafruit_ADS1115
:
public
Adafruit_ADS1015
{
public:
Adafruit_ADS1115
(
uint8_t
i2cAddress
=
ADS1015_ADDRESS
);
private:
};
Firmware/lib/readme.txt
0 → 100644
View file @
df244490
This directory is intended for the project specific (private) libraries.
PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]".
For example, see how can be organized `Foo` and `Bar` libraries:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional, custom build options, etc) http://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- readme.txt --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Then in `src/main.c` you should use:
#include <Foo.h>
#include <Bar.h>
// rest H/C/CPP code
PlatformIO will find your libraries automatically, configure preprocessor's
include paths and build them.
More information about PlatformIO Library Dependency Finder
- http://docs.platformio.org/page/librarymanager/ldf.html
Firmware/platformio.ini
0 → 100644
View file @
df244490
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; http://docs.platformio.org/page/projectconf.html
[env:nanoatmega328]
platform
=
atmelavr
board
=
nanoatmega328
framework
=
arduino
Firmware/src/ADS1115.cpp
0 → 100644
View file @
df244490
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115
ads0
(
0x48
);
Adafruit_ADS1115
ads1
(
0x49
);
int16_t
adc0
,
adc1
,
adc2
,
adc3
,
adc4
,
adc5
,
adc6
,
adc7
;
void
setup
(
void
)
{
Serial
.
begin
(
115200
);
//Serial.println("Hello!");
//Serial.println("Getting single-ended readings from AIN0..3");
//Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
ads0
.
begin
();
ads1
.
begin
();
}
void
loop
(
void
)
{
adc0
=
ads0
.
readADC_SingleEnded
(
0
);
adc1
=
ads0
.
readADC_SingleEnded
(
1
);
adc2
=
ads0
.
readADC_SingleEnded
(
2
);
/*adc3 = ads0.readADC_SingleEnded(3);
adc4 = ads1.readADC_SingleEnded(0);
adc5 = ads1.readADC_SingleEnded(1);
adc6 = ads1.readADC_SingleEnded(2);
adc7 = ads1.readADC_SingleEnded(3);*/
Serial
.
print
(
adc0
);
Serial
.
print
(
" "
);
Serial
.
print
(
adc1
);
Serial
.
print
(
" "
);
Serial
.
print
(
adc2
);
/*Serial.print(" ");
Serial.print(adc3);
Serial.print(" ");
Serial.print(adc4);
Serial.print(" ");