MPR121 work with touch but not when acting as a liquid level

Newest color sensor got you blue? Check in here.
I was trying to achieve liquid level indicator with mpr 121 and followed https://www.youtube.com/watch?v=PJJmQwqGQDM

it worked when i manually touch the copper plates but when adding water, it does not detect the levels. Here is my config


Code: Select all
//============ Device Address
// ADD pin is Vcc So address is 0x5B
#define MPR121_ADDR 0x5B   


// MPR121 Register Defines
#define E0BV   0x1E
#define E1BV   0x1F
#define E2BV   0x20
#define E3BV   0x21
#define E4BV   0x22
#define E5BV   0x23
#define E6BV   0x24
#define E7BV   0x25
#define E8BV   0x26
#define E9BV   0x27
#define E10BV   0x28
#define E11BV   0x29
#define E12BV   0x2A


#define MHD_R   0x2B
#define NHD_R   0x2C
#define   NCL_R    0x2D
#define   FDL_R   0x2E
#define   MHD_F   0x2F
#define   NHD_F   0x30
#define   NCL_F   0x31
#define   FDL_F   0x32


#define   ELE0_T   0x41
#define   ELE0_R   0x42
#define   ELE1_T   0x43
#define   ELE1_R   0x44
#define   ELE2_T   0x45
#define   ELE2_R   0x46
#define   ELE3_T   0x47
#define   ELE3_R   0x48
#define   ELE4_T   0x49
#define   ELE4_R   0x4A
#define   ELE5_T   0x4B
#define   ELE5_R   0x4C
#define   ELE6_T   0x4D
#define   ELE6_R   0x4E
#define   ELE7_T   0x4F
#define   ELE7_R   0x50
#define   ELE8_T   0x51
#define   ELE8_R   0x52
#define   ELE9_T   0x53
#define   ELE9_R   0x54
#define   ELE10_T   0x55
#define   ELE10_R   0x56
#define   ELE11_T   0x57
#define   ELE11_R   0x58


#define   AFE1_CFG   0x5C
#define   AFE2_CFG   0x5D
#define   ELE_CFG      0x5E


#define GPIO_CTRL0   0x73
#define   GPIO_CTRL1   0x74
#define GPIO_DATA   0x75
#define   GPIO_DIR   0x76
#define   GPIO_EN      0x77
#define   GPIO_SET   0x78
#define   GPIO_CLEAR   0x79
#define   GPIO_TOGGLE   0x7A


#define   ATO_CFG0   0x7B
#define   ATO_CFGU   0x7D
#define   ATO_CFGL   0x7E
#define   ATO_CFGT   0x7F
#define   RES_CF          0x80

// Global Constants   //隔住阻焊层
#define TOU_THRESH   0x06
#define   REL_THRESH   0x03
#define   START_BV   0x90
// Global Constants   //隔住0.5mm
//#define TOU_THRESH   0x06
//#define   REL_THRESH   0x03



Code: Select all
void MPR121::begin(void){
   // STOP
   mpwrite(ELE_CFG, 0x00);
        mpwrite(RES_CF, 0X63);
        delay(10);
   // Section A
   // This group controls filtering when data is > baseline.
   mpwrite(MHD_R, 0x01);
   mpwrite(NHD_R, 0x01);
   mpwrite(NCL_R, 0x00);
   mpwrite(FDL_R, 0x00);

   // Section B
   // This group controls filtering when data is < baseline.
   mpwrite(MHD_F, 0x01);
   mpwrite(NHD_F, 0x01);
   mpwrite(NCL_F, 0xFF);
   mpwrite(FDL_F, 0x02);

   // Section C
   // This group sets touch and release thresholds for each electrode
   mpwrite(ELE0_T, TOU_THRESH);
   mpwrite(ELE0_R, REL_THRESH);
   mpwrite(ELE1_T, TOU_THRESH);
   mpwrite(ELE1_R, REL_THRESH);
   mpwrite(ELE2_T, TOU_THRESH);
   mpwrite(ELE2_R, REL_THRESH);
   mpwrite(ELE3_T, TOU_THRESH);
   mpwrite(ELE3_R, REL_THRESH);
   mpwrite(ELE4_T, TOU_THRESH);
   mpwrite(ELE4_R, REL_THRESH);
   mpwrite(ELE5_T, TOU_THRESH);
   mpwrite(ELE5_R, REL_THRESH);
   mpwrite(ELE6_T, TOU_THRESH);
   mpwrite(ELE6_R, REL_THRESH);
   mpwrite(ELE7_T, TOU_THRESH);
   mpwrite(ELE7_R, REL_THRESH);
   mpwrite(ELE8_T, TOU_THRESH);
   mpwrite(ELE8_R, REL_THRESH);
   mpwrite(ELE9_T, TOU_THRESH);
   mpwrite(ELE9_R, REL_THRESH);
   mpwrite(ELE10_T, TOU_THRESH);
   mpwrite(ELE10_R, REL_THRESH);
   mpwrite(ELE11_T, TOU_THRESH);
   mpwrite(ELE11_R, REL_THRESH);

   // Section D
   // Set the Filter Configuration
   // Set ESI2
   mpwrite(AFE1_CFG, 0x10);
   //AFE配置1 (默认=0x10)
   //   一级采样FFI:00-6次
   //   充放电电流CDC:100000 - 32uA
   mpwrite(AFE2_CFG, 0x04);
   //AFE配置2   (默认=0x24)
   //   充电时间CDT:010 - 1us
   //   二级采样SFI:00 - 4次
   //   二级采样间隔ESI:100 - 16ms


   // Section E
   // Electrode Configuration
   // Enable 6 Electrodes and set to run mode
   // Set ELE_CFG to 0x00 to return to standby mode
   mpwrite(ELE_CFG, 0x8C);   // Enables all 12 Electrodes

   //AFE配置1
   //   CL
   //   ELEPROX
   //   ELE:
   // Section F
   // Enable Auto Config and auto Reconfig
   /*mpwrite(ATO_CFG0, 0x0B);
   mpwrite(ATO_CFGU, 0xC9);   // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   mpwrite(ATO_CFGL, 0x82);   // LSL = 0.65*USL = 0x82 @3.3V
   mpwrite(ATO_CFGT, 0xB5);*/   // Target = 0.9*USL = 0xB5 @3.3V
}


Code: Select all
int MPR121::touch(void)
{
   Wire.requestFrom((uint8_t)MPR121_ADDR,(uint8_t)2); 
   uint8_t a,b;
   if(Wire.available()>=2)    // slave may send less than requested
   {
#if defined(ARDUINO) && ARDUINO >= 100
     a = Wire.read(); // receive a byte as character
     b = Wire.read();
#else
     a = Wire.receive(); // receive a byte as character
     b = Wire.receive();
#endif
     return (a | (int)(b<<8));
   }else
   {
     return 0;
   }   
}



Here is the arduino code

Code: Select all
#include <mpr121.h>
#include <Wire.h>


int irqpin = 2; // Digital 2
boolean touchStates[12]; //to keep track of the previous touch states
int prev = -1;
int tVar = -1;

void setup() {
  Serial.begin(19200);
  Wire.begin();
  CapaTouch.begin(); // this calls the begin above
  delay(500);
  Serial.println("START"); 
}

void loop()
{
  int var = CapaTouch.touch(); // this calls touch defined above
  int num = GetSensorNumber(var);

  if(num != -1 && num != prev)
  {
    Serial.print("Num: ");
    Serial.println(num);
    prev = num;
  } 
}

int GetSensorNumber(int var)
{
   if ((var&0x0800) >0) return 12;
   if ((var&0x0400) >0) return 11;
   if ((var&0x0200) >0) return 10;
   if ((var&0x0100) >0) return 9;
   if ((var&0x0080) >0) return 8;
   if ((var&0x0040) >0) return 7;
   if ((var&0x0020) >0) return 6;
   if ((var&0x0010) >0) return 5;
   if ((var&0x0008) >0) return 4;
   if ((var&0x0004) >0) return 3;
   if ((var&0x0002) >0) return 2;
   if ((var&0x0001) >0) return 1;
  return -1;
}
smartwatch
 
Posts: 3
Joined: Thu Jan 05, 2017 1:27 am

Is your setup exactly the same with the metal tape going all the way around the jar? Is your jar also glass?

Did you try this? (this is from the creator of the video)
I found that with only using 6 inputs, the lowest two foils would not read the level properly. It needed a reference point, so I configured a 7th input connected to foil glued to the bottom of the jar. Then the lowest measuring


Sadly there is no way for me to look at your config and know if it is correct or not.


smartwatch wrote:I was trying to achieve liquid level indicator with mpr 121 and followed https://www.youtube.com/watch?v=PJJmQwqGQDM

it worked when i manually touch the copper plates but when adding water, it does not detect the levels. Here is my config


Code: Select all
//============ Device Address
// ADD pin is Vcc So address is 0x5B
#define MPR121_ADDR 0x5B   


// MPR121 Register Defines
#define E0BV   0x1E
#define E1BV   0x1F
#define E2BV   0x20
#define E3BV   0x21
#define E4BV   0x22
#define E5BV   0x23
#define E6BV   0x24
#define E7BV   0x25
#define E8BV   0x26
#define E9BV   0x27
#define E10BV   0x28
#define E11BV   0x29
#define E12BV   0x2A


#define MHD_R   0x2B
#define NHD_R   0x2C
#define   NCL_R    0x2D
#define   FDL_R   0x2E
#define   MHD_F   0x2F
#define   NHD_F   0x30
#define   NCL_F   0x31
#define   FDL_F   0x32


#define   ELE0_T   0x41
#define   ELE0_R   0x42
#define   ELE1_T   0x43
#define   ELE1_R   0x44
#define   ELE2_T   0x45
#define   ELE2_R   0x46
#define   ELE3_T   0x47
#define   ELE3_R   0x48
#define   ELE4_T   0x49
#define   ELE4_R   0x4A
#define   ELE5_T   0x4B
#define   ELE5_R   0x4C
#define   ELE6_T   0x4D
#define   ELE6_R   0x4E
#define   ELE7_T   0x4F
#define   ELE7_R   0x50
#define   ELE8_T   0x51
#define   ELE8_R   0x52
#define   ELE9_T   0x53
#define   ELE9_R   0x54
#define   ELE10_T   0x55
#define   ELE10_R   0x56
#define   ELE11_T   0x57
#define   ELE11_R   0x58


#define   AFE1_CFG   0x5C
#define   AFE2_CFG   0x5D
#define   ELE_CFG      0x5E


#define GPIO_CTRL0   0x73
#define   GPIO_CTRL1   0x74
#define GPIO_DATA   0x75
#define   GPIO_DIR   0x76
#define   GPIO_EN      0x77
#define   GPIO_SET   0x78
#define   GPIO_CLEAR   0x79
#define   GPIO_TOGGLE   0x7A


#define   ATO_CFG0   0x7B
#define   ATO_CFGU   0x7D
#define   ATO_CFGL   0x7E
#define   ATO_CFGT   0x7F
#define   RES_CF          0x80

// Global Constants   //隔住阻焊层
#define TOU_THRESH   0x06
#define   REL_THRESH   0x03
#define   START_BV   0x90
// Global Constants   //隔住0.5mm
//#define TOU_THRESH   0x06
//#define   REL_THRESH   0x03



Code: Select all
void MPR121::begin(void){
   // STOP
   mpwrite(ELE_CFG, 0x00);
        mpwrite(RES_CF, 0X63);
        delay(10);
   // Section A
   // This group controls filtering when data is > baseline.
   mpwrite(MHD_R, 0x01);
   mpwrite(NHD_R, 0x01);
   mpwrite(NCL_R, 0x00);
   mpwrite(FDL_R, 0x00);

   // Section B
   // This group controls filtering when data is < baseline.
   mpwrite(MHD_F, 0x01);
   mpwrite(NHD_F, 0x01);
   mpwrite(NCL_F, 0xFF);
   mpwrite(FDL_F, 0x02);

   // Section C
   // This group sets touch and release thresholds for each electrode
   mpwrite(ELE0_T, TOU_THRESH);
   mpwrite(ELE0_R, REL_THRESH);
   mpwrite(ELE1_T, TOU_THRESH);
   mpwrite(ELE1_R, REL_THRESH);
   mpwrite(ELE2_T, TOU_THRESH);
   mpwrite(ELE2_R, REL_THRESH);
   mpwrite(ELE3_T, TOU_THRESH);
   mpwrite(ELE3_R, REL_THRESH);
   mpwrite(ELE4_T, TOU_THRESH);
   mpwrite(ELE4_R, REL_THRESH);
   mpwrite(ELE5_T, TOU_THRESH);
   mpwrite(ELE5_R, REL_THRESH);
   mpwrite(ELE6_T, TOU_THRESH);
   mpwrite(ELE6_R, REL_THRESH);
   mpwrite(ELE7_T, TOU_THRESH);
   mpwrite(ELE7_R, REL_THRESH);
   mpwrite(ELE8_T, TOU_THRESH);
   mpwrite(ELE8_R, REL_THRESH);
   mpwrite(ELE9_T, TOU_THRESH);
   mpwrite(ELE9_R, REL_THRESH);
   mpwrite(ELE10_T, TOU_THRESH);
   mpwrite(ELE10_R, REL_THRESH);
   mpwrite(ELE11_T, TOU_THRESH);
   mpwrite(ELE11_R, REL_THRESH);

   // Section D
   // Set the Filter Configuration
   // Set ESI2
   mpwrite(AFE1_CFG, 0x10);
   //AFE配置1 (默认=0x10)
   //   一级采样FFI:00-6次
   //   充放电电流CDC:100000 - 32uA
   mpwrite(AFE2_CFG, 0x04);
   //AFE配置2   (默认=0x24)
   //   充电时间CDT:010 - 1us
   //   二级采样SFI:00 - 4次
   //   二级采样间隔ESI:100 - 16ms


   // Section E
   // Electrode Configuration
   // Enable 6 Electrodes and set to run mode
   // Set ELE_CFG to 0x00 to return to standby mode
   mpwrite(ELE_CFG, 0x8C);   // Enables all 12 Electrodes

   //AFE配置1
   //   CL
   //   ELEPROX
   //   ELE:
   // Section F
   // Enable Auto Config and auto Reconfig
   /*mpwrite(ATO_CFG0, 0x0B);
   mpwrite(ATO_CFGU, 0xC9);   // USL = (Vdd-0.7)/vdd*256 = 0xC9 @3.3V   mpwrite(ATO_CFGL, 0x82);   // LSL = 0.65*USL = 0x82 @3.3V
   mpwrite(ATO_CFGT, 0xB5);*/   // Target = 0.9*USL = 0xB5 @3.3V
}


Code: Select all
int MPR121::touch(void)
{
   Wire.requestFrom((uint8_t)MPR121_ADDR,(uint8_t)2); 
   uint8_t a,b;
   if(Wire.available()>=2)    // slave may send less than requested
   {
#if defined(ARDUINO) && ARDUINO >= 100
     a = Wire.read(); // receive a byte as character
     b = Wire.read();
#else
     a = Wire.receive(); // receive a byte as character
     b = Wire.receive();
#endif
     return (a | (int)(b<<8));
   }else
   {
     return 0;
   }   
}



Here is the arduino code

Code: Select all
#include <mpr121.h>
#include <Wire.h>


int irqpin = 2; // Digital 2
boolean touchStates[12]; //to keep track of the previous touch states
int prev = -1;
int tVar = -1;

void setup() {
  Serial.begin(19200);
  Wire.begin();
  CapaTouch.begin(); // this calls the begin above
  delay(500);
  Serial.println("START"); 
}

void loop()
{
  int var = CapaTouch.touch(); // this calls touch defined above
  int num = GetSensorNumber(var);

  if(num != -1 && num != prev)
  {
    Serial.print("Num: ");
    Serial.println(num);
    prev = num;
  } 
}

int GetSensorNumber(int var)
{
   if ((var&0x0800) >0) return 12;
   if ((var&0x0400) >0) return 11;
   if ((var&0x0200) >0) return 10;
   if ((var&0x0100) >0) return 9;
   if ((var&0x0080) >0) return 8;
   if ((var&0x0040) >0) return 7;
   if ((var&0x0020) >0) return 6;
   if ((var&0x0010) >0) return 5;
   if ((var&0x0008) >0) return 4;
   if ((var&0x0004) >0) return 3;
   if ((var&0x0002) >0) return 2;
   if ((var&0x0001) >0) return 1;
  return -1;
}
ameyer
Founder
 
Posts: 3323
Joined: Thu Jan 21, 2010 11:59 pm
Location: The Bay Area

Thanks for the reply. No i do not have the copper tapes on a full circle on the plastic container. I will give that a try and will update you with the pictures.

I will also try doing the suggestion with the bottom of the Jar. This should work with plastic or glass Jar as they have poor conductivity than metal. SO i think plastic or glass should not matter
smartwatch
 
Posts: 3
Joined: Thu Jan 05, 2017 1:27 am

Plastic and glass have different "Dielectric constants" so it will matter some. I'm not sure how though


smartwatch wrote:Thanks for the reply. No i do not have the copper tapes on a full circle on the plastic container. I will give that a try and will update you with the pictures.

I will also try doing the suggestion with the bottom of the Jar. This should work with plastic or glass Jar as they have poor conductivity than metal. SO i think plastic or glass should not matter
ameyer
Founder
 
Posts: 3323
Joined: Thu Jan 21, 2010 11:59 pm
Location: The Bay Area

they do have different dielectric constant but not that much of a different to radically alter the capacitance, which is good.

But Thanks @ameyer. i increased the surface area of the copper tapes to be around the glass jar and it worked. That was the key thing and you nailed it . Thanks alot.
smartwatch
 
Posts: 3
Joined: Thu Jan 05, 2017 1:27 am


Return to Hardware Help

Who is online

Users browsing this forum: No registered users and 1 guest