Cant get any data from my sensor

Arduino UNO with ESP8266
On Android

Im trying to get data from the sensor to read at virtual pin on my blnyk app
Try to study this alone… Just cant get my head wrap around it

/*************************************************************
  Download latest Blynk library here:
    https://github.com/blynkkk/blynk-library/releases/latest

  Blynk is a platform with iOS and Android apps to control
  Arduino, Raspberry Pi and the likes over the Internet.
  You can easily build graphic interfaces for all your
  projects by simply dragging and dropping widgets.

    Downloads, docs, tutorials: http://www.blynk.cc
    Sketch generator:           http://examples.blynk.cc
    Blynk community:            http://community.blynk.cc
    Follow us:                  http://www.fb.com/blynkapp
                                http://twitter.com/blynk_app

  Blynk library is licensed under MIT license
  This example code is in public domain.

 *************************************************************
  WARNING!
    It's very tricky to get it working. Please read this article:
    http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware

  Output any data on LCD widget!

  App project setup:

    LCD widget, SIMPLE mode, in widget settings :

    - Select pin V0 for zero pin
    - Select pin V1 for first pin
    - Change "Reading Frequency" to PUSH mode
    - Type into first edit field "/pin0/ seconds"
    - Type into second edit field "/pin1/ millis"
 *************************************************************/

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00            //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection



// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "7478f757cb7a4456889a987d2b4ff8e8";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "MaroiFunFun@unifi";
char pass[] = "hud4shr@ff";

// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial1

// or Software Serial on Uno, Nano...
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(2, 3); // RX, TX

// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600

ESP8266 wifi(&EspSerial);

int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0; 

BlynkTimer timer;

void sendSeconds() {
  Blynk.virtualWrite(V0, millis() / 1000);
}

void sendMillis() {
  Blynk.virtualWrite(V1, millis());
}

void setup()
{
  // Debug console
  Serial.begin(9600);

  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, wifi, ssid, pass, "blynk-cloud.com", 80);
  //Blynk.begin(auth, wifi, ssid, pass, IPAddress(192,168,1,100), 8080);

  // Setup a function to be called every second
  timer.setInterval(1000L, sendSeconds);
  // Setup a function to be called every second
  timer.setInterval(1000L, sendMillis);
}


void myTimerEvent()
{
  static unsigned long samplingTime = millis();
  static unsigned long printTime = millis();
  static float pHValue,voltage;
  if(millis()-samplingTime > samplingInterval)
  {
      pHArray[pHArrayIndex++]=analogRead(A0);
      if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
      voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
      pHValue = 4.0*voltage+Offset;
      samplingTime=millis();
  }
  Blynk.virtualWrite(V3, pHValue); //sending to Blynk
}
double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    Serial.println("Error number for the array to avraging!/n");
    return 0;
  }
  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i<number;i++){
      amount+=arr[i];
    }
    avg = amount/number;
    return avg;
  }else{
    if(arr[0]<arr[1]){
      min = arr[0];max=arr[1];
    }
    else{
      min=arr[1];max=arr[0];
    }
    for(i=2;i<number;i++){
      if(arr[i]<min){
        amount+=min;        //arr<min
        min=arr[i];
      }else {
        if(arr[i]>max){
          amount+=max;    //arr>max
          max=arr[i];
        }else{
          amount+=arr[i]; //min<=arr<=max
        }
      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}

void loop()
{
  Blynk.run();
  timer.run();
}

Where are the functions you call? (sendSeconds and sendMillis)
In addition to that, your have 2 timers at the same time , not possible unless you use ESP32 !

and where is the timer calling your myTimerEvent () function ?

Thank you for replying.

I’m a student, still learning, a very beginner programmer. I don’t understand your question. i simply copy from the blynk example builder and then transfer my calculation of the sensor to the example code.

Can you explain more?

sorry I missed

void sendSeconds() {
  Blynk.virtualWrite(V0, millis() / 1000);
}
void sendMillis() {
  Blynk.virtualWrite(V1, millis());
}

but you need to stage timers and add a timer to call myTimerEvent ()

Okay. i have added code below but still no data

{

timer.setInterval(1000L, myTimerEvent);
}

did you add this to the setup?

What type of display/widget do you have attached to V3? is the reading rate of this widget set to push? Do you need to check the pH every second?

Yes i added the code to setup.

I used the value display widget. Yes, i set it to push. Every 1 seconds.

Can you help me?

Is the device actually connecting to BLYNK?

Is the project running?

Try adding some serial prints to your function to see if the sensor is actually producing data.

You don’t need this. The timer takes care of this for you.

Pete.

You have 3 timers at 1000L !

Yes connected. I set a LED on pin digital it can switch on. Maybe something wrong in myTimerEvent().

I already remove it but still no data. :frowning:

What should i put instead sir?
Thank you for replying

Maybe like this?

void myTimerEvent()
{

  static float pHValue,voltage;
  
      pHArray[pHArrayIndex++]=analogRead(A0);
      if(pHArrayIndex==ArrayLenth)
      { 
           pHArrayIndex=0;
           voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
           pHValue = 4.0*voltage+Offset;
           Blynk.virtualWrite(V3, pHValue); //sending to Blynk
        }
}

and then decrease your timer interval to like .1 seconds

timer.setInterval(100L, myTimerEvent);

so 40 total samples, with each sample taken every .1 seconds, you should get an averaged reading every 4 seconds??

2 Likes

Waaaa. Thank you very much. That pretty much done it. :smile:

2 Likes

Sir,
Can you help me with one more thing. I seem cannot to display data on my LCD. When i run the coding without the blynk connection, the lcd seem to be working.

/*************************************************************
  Download latest Blynk library here:
    https://github.com/blynkkk/blynk-library/releases/latest

  Blynk is a platform with iOS and Android apps to control
  Arduino, Raspberry Pi and the likes over the Internet.
  You can easily build graphic interfaces for all your
  projects by simply dragging and dropping widgets.

    Downloads, docs, tutorials: http://www.blynk.cc
    Sketch generator:           http://examples.blynk.cc
    Blynk community:            http://community.blynk.cc
    Follow us:                  http://www.fb.com/blynkapp
                                http://twitter.com/blynk_app

  Blynk library is licensed under MIT license
  This example code is in public domain.

 *************************************************************
  WARNING!
    It's very tricky to get it working. Please read this article:
    http://help.blynk.cc/hardware-and-libraries/arduino/esp8266-with-at-firmware

  Output any data on LCD widget!

  App project setup:

    LCD widget, SIMPLE mode, in widget settings :

    - Select pin V0 for zero pin
    - Select pin V1 for first pin
    - Change "Reading Frequency" to PUSH mode
    - Type into first edit field "/pin0/ seconds"
    - Type into second edit field "/pin1/ millis"
 *************************************************************/

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define SensorPin A0            //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00            //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "7478f757cb7a4456889a987d2b4ff8e8";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "MaroiFunFun@unifi";
char pass[] = "hud4shr@ff";

// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial1

// or Software Serial on Uno, Nano...
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(2, 3); // RX, TX

// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600

ESP8266 wifi(&EspSerial);

int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0; 

BlynkTimer timer;

void sendSeconds() {
  Blynk.virtualWrite(V0, millis() / 1000);
}

void sendMillis() {
  Blynk.virtualWrite(V1, millis());
}

void setup()
{
  // Debug console
  Serial.begin(9600);

  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, wifi, ssid, pass, "blynk-cloud.com", 80);
  //Blynk.begin(auth, wifi, ssid, pass, IPAddress(192,168,1,100), 8080);
  lcd.begin(16,2);
  timer.setInterval(100L, myTimerEvent);
  
}


void myTimerEvent()
{

  static float pHValue,voltage;
  
      pHArray[pHArrayIndex++]=analogRead(A0);
      if(pHArrayIndex==ArrayLenth)
      { 
           pHArrayIndex=0;
           voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
           pHValue = 4.0*voltage+Offset;
           Blynk.virtualWrite(V3, pHValue); //sending to Blynk
      }
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("pH      = ");
    lcd.print(pHValue); 
}


double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    Serial.println("Error number for the array to avraging!/n");
    return 0;
  }
  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i<number;i++){
      amount+=arr[i];
    }
    avg = amount/number;
    return avg;
  }else{
    if(arr[0]<arr[1]){
      min = arr[0];max=arr[1];
    }
    else{
      min=arr[1];max=arr[0];
    }
    for(i=2;i<number;i++){
      if(arr[i]<min){
        amount+=min;        //arr<min
        min=arr[i];
      }else {
        if(arr[i]>max){
          amount+=max;    //arr>max
          max=arr[i];
        }else{
          amount+=arr[i]; //min<=arr<=max
        }
      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}

void loop()
{
  Blynk.run();
  timer.run();
}

what pins is the LCD connected to?

try putting it inside the second if statement.

void myTimerEvent()
{

  static float pHValue,voltage;
  
      pHArray[pHArrayIndex++]=analogRead(A0);
      if(pHArrayIndex==ArrayLenth)
      { 
           pHArrayIndex=0;
           voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
           pHValue = 4.0*voltage+Offset;
           Blynk.virtualWrite(V3, pHValue); //sending to Blynk
     
              lcd.clear();
             lcd.setCursor(0,1);
              lcd.print("pH      = ");
               lcd.print(pHValue); 
    }
}

Still no display. Other data also not displaying.

The lcd connected to the sda and the scl pins.