Blynk 2.0 LCD

Still working on my provisioning question from the weekend, making some headway but still muddling around so no real updates there yet.

New question:

Does the Blynk LCD widget operate any differently with Blynk2.0? I’ve never used the widget before in either Blynk, but I feel I am doing something incorrect, as nothing displays in the “lcd” of the app.

I was unsure which datastream type to use, assumed String but I have tried all the types and no change in function.

Here is the code, I don’t get any compile errors, and everything else seems to be working fine, just not getting any displayed text in the LCD.

Thanks in advance for any help.

I am operating the LCD in “advanced” mode as I am mainly using it for text display, not unit values.

// Fill-in information for your Blynk connection here
 
 
#define BLYNK_TEMPLATE_ID "xxxxxx"
#define BLYNK_DEVICE_NAME "xxxxxx"
#define BLYNK_HEARTBEAT 30
#define BLYNK_FIRMWARE_VERSION        "0.2.2"
#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG
#define APP_DEBUG
 
// Pin Defines
 
#define PHOTOCLICK V5
#define LED 4
#define DOORUP V7
#define DOORDOWN V6
#define DOORLOCK V9
 
 
// Uncomment your board, or configure a custom board in Settings.h
//define USE_WROVER_BOARD
 
// Libraries
 
#include "BlynkEdgent.h"
#include "esp_camera.h"
#include "Arduino.h"
#include <ESP32_FTPClient.h>
#include "soc/soc.h"           // Disable brownout problems
#include "soc/rtc_cntl_reg.h"  // Disable brownout problems
 
// Blynkv LED setup
 
WidgetLED led1(V1);
WidgetLED led2(V2);
WidgetLED led3(V3);
WidgetLED led4(V4);
WidgetLCD lcd(V8);
 
// Pin definition for CAMERA_MODEL_AI_THINKER
 
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27
 
#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22
 
//FTP server information and setup
 
char ftp_server[] = "files.000webhost.com";
char ftp_user[] = "xxxxx";
char ftp_pass[] ="xxxxx";
ESP32_FTPClient ftp (ftp_server,ftp_user,ftp_pass, 5000, 2); // you can pass a FTP timeout and debbug mode on the last 2 arguments
 
// Variables 
 
bool takePhoto = false; 
bool loading = false;
bool newImage = false;
bool newDisplay = false;
bool doorLock = false;
String coopImageURL; //= "https://coopcommandimages.000webhostapp.com/uploads/1.png";
int i = 1;
int ic = 1;
int imageFlip = 1;
char coopRx; // Info received from CoopCommand
bool newDataRx = false; //has CoopCam received new data from CoopCommand
 
 
void setup() {
 
  // Startup Serial, Blynk, Blynk Timers and initial imamge. Disable brownout detector
  Serial.begin(115200);
  delay(50);
  BlynkEdgent.begin();
  pinMode(LED, OUTPUT);
  timer.setInterval(500,coopCom);
  timer.setInterval(150,loadingImage);
  timer.setInterval(500,doorLocked);
  timer.setInterval(500,lcdDisplay);
  Blynk.virtualWrite(V0, 3); 
 
  //disable brownout detector
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); 
 
  // Configure the Camera
 
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG; 
 
// Image settings depending on PSRAM availability
 
  if(psramFound()){
    config.frame_size = FRAMESIZE_SVGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
    config.jpeg_quality = 20;
    config.fb_count = 2;
  } 
  else {
    config.frame_size = FRAMESIZE_VGA;
    config.jpeg_quality = 20;
    config.fb_count = 1;
  }
  // Initialize Camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    return;
  }
 
}
 
 
// Changes image in Blynk app depending on camera state
void loadingImage( void ) {
if (loading) { 
  Blynk.virtualWrite(V0, (i+2));
  if (i <= 9) {
    i ++;
  }
  else if (i > 9) {
    i = 1;
  }
}
else if (!loading) {
  if (ic == 1) {
    coopImageURL = "https://coopcommandimages.000webhostapp.com/uploads/coopPic5.jpg";
  }
  else if (ic == 2) {
    coopImageURL = "https://coopcommandimages.000webhostapp.com/uploads/coopPic6.jpg";
  }
  else if (ic == 3) {
    coopImageURL = "https://coopcommandimages.000webhostapp.com/uploads/coopPic7.jpg";
  }
  if (newImage) {
  Blynk.setProperty(V0, "url", (ic-1), coopImageURL);
  Blynk.virtualWrite(V0, (ic-1));
  newImage = false;       
}
i = 1; 
}
}
 
// Sends a new image to the FTP server 
 
void sendPhoto ( void ) {
   if (takePhoto) {
 
   camera_fb_t * fb = NULL;
 
  // Take Picture with Camera
  fb = esp_camera_fb_get(); 
  digitalWrite(LED, LOW); 
  delay (50);
  if(!fb) {
    ESP.restart();
    return;
  }
 
if (imageFlip == 1) {
  ftp.OpenConnection();
  // Create the new file and send the image
  ftp.ChangeWorkDir("/public_html/uploads/");
  ftp.InitFile("Type I");
  ftp.NewFile("coopPic5.jpg");
  ftp.WriteData( fb->buf, fb->len );
  ftp.CloseFile();
  ftp.CloseConnection();
  takePhoto = false;
  imageFlip = 2;
  ic = 1;
  esp_camera_fb_return(fb);
    Serial.print('N');
   }
else if (imageFlip == 2) {
   ftp.OpenConnection();
  // Create the new file and send the image
  ftp.ChangeWorkDir("/public_html/uploads/");
  ftp.InitFile("Type I");
  ftp.NewFile("coopPic6.jpg");
  ftp.WriteData( fb->buf, fb->len );
  ftp.CloseFile();
  ftp.CloseConnection();
  takePhoto = false;
  imageFlip = 3;
  ic = 2;
  esp_camera_fb_return(fb);
  Serial.print('N');
   }
else if (imageFlip == 3) {
   ftp.OpenConnection();
  // Create the new file and send the image
  ftp.ChangeWorkDir("/public_html/uploads/");
  ftp.InitFile("Type I");
  ftp.NewFile("coopPic7.jpg");
  ftp.WriteData( fb->buf, fb->len );
  ftp.CloseFile();
  ftp.CloseConnection();
  takePhoto = false;
  imageFlip = 1;
  ic = 3;
  esp_camera_fb_return(fb);
  Serial.print('N');
   }
}
}
 
// Serial communication with CoopCommand board
 
void coopCom ( void ) {
 
  if (Serial.available() > 0) {
    coopRx = Serial.read();
    newDataRx = true;
  }
  if (newDataRx == true) {
    if (coopRx == 'O') { //If CoopCommand says the door is up
      led1.on();
      led2.off();
      led3.off();
      led4.off();
      newDataRx = false;
    }
    if (coopRx == 'S') { //If CoopCommand says the door is down
 
      led1.off();
      led2.on();
      led3.off();
      led4.off();
      newDataRx = false;
    }
    if (coopRx == 'U') { //If CoopCommand says the door is opening
      led1.off();
      led2.off();
      led3.on();
      led4.off();
      newDataRx = false;
    }
    if (coopRx == 'D') { //If CoopCommand says the door is closing
      led1.off();
      led2.off();
      led3.off();
      led4.on();
      newDataRx = false;
    }
  }
}
 
// Put the door up
 
BLYNK_WRITE(DOORUP) {
Serial.print('U');
}
 
// Put the door down
 
BLYNK_WRITE(DOORDOWN) {
Serial.print('D');
}

BLYNK_WRITE(DOORLOCK) {
doorLock = true;
}

void lcdDisplay (void) {
    if (coopRx == 'O') { //If CoopCommand says the door is up
      lcd.clear(); //Use it to clear the LCD Widget
      lcd.print(4, 0, "COOP DOOR:"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
      lcd.print(4, 1, "OPEN"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
    if (coopRx == 'S') { //If CoopCommand says the door is down
      lcd.clear(); //Use it to clear the LCD Widget
      lcd.print(4, 0, "COOP DOOR:"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
      lcd.print(4, 1, "CLOSED"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
    if (coopRx == 'U') { //If CoopCommand says the door is opening
      lcd.clear(); //Use it to clear the LCD Widget
      lcd.print(4, 0, "COOP DOOR:"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
      lcd.print(4, 1, "OPENING"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
    if (coopRx == 'D') { //If CoopCommand says the door is closing
      lcd.clear(); //Use it to clear the LCD Widget
      lcd.print(4, 0, "COOP DOOR:"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
      lcd.print(4, 1, "CLOSING"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
}
}

void doorLocked (void) {
  if (doorLock) {
     Serial.print('D');
     doorLock = false;
  }
}
// Take a photo and display it in the app
 
BLYNK_WRITE(V5) {
digitalWrite(LED, HIGH);
Serial.print('L'); 
takePhoto = true;
loading = true;
newImage = true;
loadingImage();
timer.setTimeout(250, sendPhoto);
timer.setTimeout(3000, []()
{
  loading = false;
  loadingImage();
});
}
 
 
void loop() {
  BlynkEdgent.run();
}

The LCD widget does work the same as in Legacy Blynk, certainly in Advanced mode (the only mode I’ve tested). The datastream type needs to be String.

One thing I did notice was that at one point the LCD widget seemed to forget it’s datastream when I edited one of the other widgets on the app dashboard, but I’ve not been able to re-create that.

So, try double-checking that the LCD widget is actually connected to a datastream.

Pete.

Hmmm, datastream is still pointed to the correct datastream.

I’ll play around with a more basic sketch and see if I can get some functionality.

Thanks Pete

I feel I must be missing something here.
I adapted the Blynk Advanced LCD example to be added to the Blynk Edgent example
code:


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "xxxxx"
#define BLYNK_DEVICE_NAME "xxxxx"

#define BLYNK_FIRMWARE_VERSION        "0.1.0"

#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG

#define APP_DEBUG

// Uncomment your board, or configure a custom board in Settings.h
//#define USE_WROVER_BOARD
//#define USE_TTGO_T7

#include "BlynkEdgent.h"

WidgetLCD lcd(V1);

void setup()
{
  Serial.begin(115200);
  delay(100);

  BlynkEdgent.begin();
   lcd.clear(); //Use it to clear the LCD Widget
  lcd.print(4, 0, "Hello"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
  lcd.print(4, 1, "World");
}

void loop() {
  BlynkEdgent.run();
}

Still nothing displayed on the LCD

Edit: Datastream is setup as V1 - String

I’d put that in BLYNK_CONNECTED() if I were you, or in a function that you call with a timer.

Pete.

Hey Pete, thanks for the quick response.

I initially tried to have all my LCD stuff in a timer (my first posted code block) but no joy there either.

BLYNK_CONNECTED()
{
  lcd.clear(); //Use it to clear the LCD Widget
  lcd.print(4, 0, "Hello"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
  lcd.print(4, 1, "World");  
}

Works for me.

Pete.

Just tried putting it in a Blynk_Connected()


// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID "xxxx"
#define BLYNK_DEVICE_NAME "xxxx"

#define BLYNK_FIRMWARE_VERSION        "0.1.1"

#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG

#define APP_DEBUG

// Uncomment your board, or configure a custom board in Settings.h
//#define USE_WROVER_BOARD
//#define USE_TTGO_T7

#include "BlynkEdgent.h"

WidgetLCD lcd(V1);

void setup()
{
  Serial.begin(115200);
  delay(100);

  BlynkEdgent.begin();
}

BLYNK_CONNECTED()
{
  lcd.clear(); //Use it to clear the LCD Widget
  lcd.print(4, 0, "Hello"); // use: (position X: 0-15, position Y: 0-1, "Message you want to print")
  lcd.print(4, 1, "World");  
}

void loop() {
  BlynkEdgent.run();
}

No change.

I’m not near the device now, so I’m reliant on Blynk.Air updates working off the Blynk Edgent sketch example, with some modified .h tabs for my AI-THINKER CAM with settings that work otherwise.

I’m wondering if there is an issue with Edgent here somehow. I’ll grab the device and upload an “old” Blynk sketch tonight and see if that work.

This was using Edgent on a NodeMCU.

Have you tried deleting the LCD widget and datastream and trying again?

Pete.

I’ve tried removing it multiple times throughout the process and re-adding it but nothing so far has changed anything.

Are you using an Android device?

I’ve just opened the same project on an Android device running app version 1.1.9(16.07.2021 20:37) and the LCD widget seems totally screwed-up, and doesn’t display anything.

In Advanced mode the /value1/ and /value2/ fields display until you switch back to Simple mode, then they re-appear when you edit the widget settings again, and it seems to forget its datastream as well.

Pete.

Yeah I am on android and the app version is 1.1.9

I don’t have it quite as strange as you, it tends to remember its datastream, and the field displays are always showing in both simple and advanced mode but the display itself shows nothing with any code I’ve tried so far.

@BlynkAndroidDev would you take a look at this issue with the LCD widget in Android please?

Take a look at the previous 2 posts in this topic for info.

The widget works fine in iOS, but doesn’t display anything in Android. This is in Advanced mode.

Pete.

Hey Peter do you think its worth me posting this issue on github as well or wait until we’ve seen a response from the BlynkAndroidDev account?

@hms11 yep, it is easier to handle such issues via the GitHub page, please also send the logs from the app.

Perfect, I will submit the issue on Github, you got that image flashing issue fixed up super quick for me, thanks for that!

Pete, if you want to leave this open for now and either I or BlynkAndroidDev can update once a fix has been put in place?

2 Likes

Issue seems solved with newest Blynk update. This issue can be closed.

Thanks for the fix!

2 Likes

Hi Pete ,

the LCD widget doesn’t work to integer ? ,

thnks pete