1602a Keypad Shield - Showing Green blocks

Hello,
I'm having a bit of trouble with getting my code to display. The code isn't mine but i have been given it by a friend who has it working.

I've managed to successfully get counting timers etc so i know the display & buttons are working.

All I can achieve is this:

See picture

#include <Arduino.h>
#line 1 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
#line 1 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
/* Thermistor Analog Pin */
#define THERMISTORPIN A1

/* How many samples to take and average, more takes longer but is more 'smooth' */
const int NUMSAMPLES = 5;
const int OILTEMPOFFSET = 93;          // OIL TEMP OFFSET
const float OILTEMPFACTOR = 0.111;       // OIL TEMP CONVERSION FACTOR

/* Stepper pins */
const int STEPPIN = 11;
const int DIRECTIONPIN = 12;

/* Haldex constants */
const int HALDEX_INCREMENT = 25;
const int HALDEX_STEPS = 20;
const int HALDEX_MAX_TEMP = 80;
const int OIL_TIME = 1000;
const unsigned long DEBOUNCE_DELAY = 300;

const String HALDEX_MESSAGE = "Haldex ";
const String HALDEX_TEMP_TOO_HIGH = "Haldex Disabled";

/* Button Pins */
const int UpButtonPin = 2;
const int DownButtonPin = 3;

/* Include the SPI/IIC Library */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>



/* Definitions for current button state */
typedef enum
{
  E_LCD_BTN_UP,             /* LCD UP button pressed */
  E_LCD_BTN_DOWN,           /* LCD DOWN button pressed */
  E_LCD_BTN_NONE            /* No button pressed */
}
teButtonState;

/* Variables */
int currentHaldexPercentage = 0;
int samples[NUMSAMPLES];
int currentTemp;

unsigned long lastDebounceTime = 0;
unsigned long oilTime;

LiquidCrystal_I2C lcd(0x27,16,2);

#line 52 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setup();
#line 65 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void loop();
#line 90 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void disableHaldex();
#line 99 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void writeTempToLCD();
#line 109 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void writeHaldexMessage();
#line 126 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotorForwards(int noOfSteps);
#line 133 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotorBackwards(int noOfSteps);
#line 140 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotor(int noOfSteps);
#line 151 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
float readTemperature();
#line 172 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void checkButtonPressed();
#line 206 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
int iGetLCDButtonState();
#line 221 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setupLCD();
#line 228 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setupMotor();
#line 52 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setup()
{
  Serial.begin(9600);

  // Setup the LCD
  setupLCD();

  // Setup the motor driver
  setupMotor();

  oilTime = 0;
}

void loop()
{  
  // Read the temperature if enough time has passed
  if(millis() - oilTime > OIL_TIME)
  {
    oilTime = millis();
    currentTemp = readTemperature();
  
    // Update LCD temp
    writeTempToLCD();
  }

  //Check Haldex Temperature
  if(currentTemp > HALDEX_MAX_TEMP)
  {
    disableHaldex();
  }
  else
  // Check if the user has pressed a button
  {
    writeHaldexMessage();
    checkButtonPressed();
  }
}

void disableHaldex()
{
  writeHaldexMessage();
  while(currentHaldexPercentage > 0)
  {
    moveMotorBackwards(HALDEX_STEPS);
  }
}

void writeTempToLCD()
{
  /* Put the LCD cursor on the first row */
  lcd.setCursor(0, 0);

  lcd.print("Temp : ");
  lcd.print(currentTemp);
  lcd.print("*C             ");
}

void writeHaldexMessage()
{
  /* Put the LCD cursor on the second row */
  lcd.setCursor(0, 1);
  
  if(currentTemp > HALDEX_MAX_TEMP)
  {
    lcd.print(HALDEX_TEMP_TOO_HIGH);
  }
  else
  {
    lcd.print(HALDEX_MESSAGE);
    lcd.print(currentHaldexPercentage);
    lcd.print("%               ");
  }
}

void moveMotorForwards(int noOfSteps)
{
  digitalWrite(DIRECTIONPIN, LOW);
  currentHaldexPercentage += HALDEX_INCREMENT;
  moveMotor(noOfSteps);
}

void moveMotorBackwards(int noOfSteps)
{
  digitalWrite(DIRECTIONPIN, HIGH);
  currentHaldexPercentage -= HALDEX_INCREMENT;
  moveMotor(noOfSteps);
}

void moveMotor(int noOfSteps)
{
  for (int i = 0; i < noOfSteps; i++)
  {
    digitalWrite(STEPPIN, HIGH);
    delay(10);
    digitalWrite(STEPPIN, LOW);
    delay(10);
  }
}

float readTemperature()
{
  uint8_t i;
  float average;

  // take N samples in a row, with a slight delay
  for (i = 0; i < NUMSAMPLES; i++) {
    samples[i] = analogRead(THERMISTORPIN);
    delay(10);
  }

  // average all the samples out
  average = 0;
  for (i = 0; i < NUMSAMPLES; i++) {
    average += samples[i];
  }
  average /= NUMSAMPLES;
  
  return OILTEMPOFFSET - (average * OILTEMPFACTOR);
}

void checkButtonPressed()
{
  // If the button has been read recently, don't read again
  if((millis() - lastDebounceTime) < DEBOUNCE_DELAY)
  {
    return;
  }
  /* Get the current state of the LCD buttons */
  int buttonState = iGetLCDButtonState();
  switch (buttonState)
  {
    /* If the UP button has been pressed then move the motor forwards */
    case E_LCD_BTN_UP:
      if(currentHaldexPercentage < 100)
      {
        lastDebounceTime = millis();
        moveMotorForwards(HALDEX_STEPS);
        writeHaldexMessage();
      }
      break;

    /* If the DOWN button has been pressed then move the motor backwards */
    case E_LCD_BTN_DOWN:
      if(currentHaldexPercentage >=  HALDEX_INCREMENT)
      {
        lastDebounceTime = millis();
        moveMotorBackwards(HALDEX_STEPS);
        writeHaldexMessage();
      }
      break;
  }
}

/* Read the current state of the LCD buttons using the ADC */
int iGetLCDButtonState()
{
  int iADC_Button_State = E_LCD_BTN_NONE;
  
  if(digitalRead(UpButtonPin) == HIGH)
  {
    iADC_Button_State = E_LCD_BTN_UP;
  }
  else if(digitalRead(DownButtonPin) == HIGH)
  {
    iADC_Button_State = E_LCD_BTN_DOWN;
  }
  return iADC_Button_State;
}

void setupLCD()
{
  /* Set the correct display size (16 character, 2 line display) */
  lcd.begin();
  writeHaldexMessage();
}

void setupMotor()
{
  // Set up the motor pins
  pinMode(DIRECTIONPIN, OUTPUT);
  pinMode(STEPPIN, OUTPUT);
  digitalWrite(DIRECTIONPIN, LOW);
  digitalWrite(STEPPIN, LOW);
}

Any ideas where i'm going wrong? I'm a little lost.

Thanks :smiley:

No picture.

Are you sure that you have the correct LiquidCrystal_I2C library? There are several and they are not the same. The use of the constructor:

LiquidCrystal_I2C lcd(0x27,16,2);

assumes that the I2C backpack is wired per the default pin mapping in the library. It very well may not be because, like I said, those libraries are not the same. A solution is to use the hd44780 library. That LCD library automatically finds the right pin mapping and the right I2C address. It takes only a few changes to replace the current library with the hd44780 library and I will help with that if you want.

To install the hd44780 library. The hd44780 library is the best available for I2C LCDs. The library is available in the Library Manager. Go to Library Manager (in the IDE menus, Sketch, Include Libraries, Manage Libraries) and in the Topics dropdown choose Display and in the Filter your search box enter hd44780. Select and install the hd44780 library by Bill Perry.

The class that you want to use is the hd44780_I2Cexp class. There are examples to show how to use the library. The nice thing about the hd44780 library is that it will autodetect the I2C address and the I2C backpack to LCD pin mapping.

In the examples, there is a diagnostic sketch that will help us to help you if you still have trouble with the display. Run the diagnostic sketch and post the results.

What keypad shield do you have?
Most use an analog pin for the buttons and control the LCD with Arduino pins vs i2c.

--- bill

I don't believe that I did not see the shield bit.

It’s the same link to the library, my friend is using and we sent the link from my his PC to mine so I installed it.

After doing some research like you say, I think the Pin out on my screen might be different when plugged into the Uno.

Not sure why the pictures aren’t showing. Let’s try again.

Here’s all I’m getting:

And just for reference, here’s the board.

I’ll have a look at migrating over to the other library and see if I can get that to play ball.

Well,

I've installed the HD4780 library and i can't get anything from it, examples wont show. it all uploads onto the device, but nothing but my green blocks on the display. I'm rubbish with electronics :frowning:

I apologize for my mistake in missing the fact that you are using a shield with the LCD and buttons. I will try to rectify the mistake.

The LCD shield is NOT an I2C LCD. It does not use the I2C interface, the shield uses the 4 bit parallel interface. See the comment marked with ******. See here for more information on the shield.

Here is your code modified to use the 4 bit parallel interface.

#include <Arduino.h>
#line 1 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
#line 1 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
/* Thermistor Analog Pin */
#define THERMISTORPIN A1

/* How many samples to take and average, more takes longer but is more 'smooth' */
const int NUMSAMPLES = 5;
const int OILTEMPOFFSET = 93;          // OIL TEMP OFFSET
const float OILTEMPFACTOR = 0.111;       // OIL TEMP CONVERSION FACTOR

/* Stepper pins */
const int STEPPIN = 11;
const int DIRECTIONPIN = 12;

/* Haldex constants */
const int HALDEX_INCREMENT = 25;
const int HALDEX_STEPS = 20;
const int HALDEX_MAX_TEMP = 80;
const int OIL_TIME = 1000;
const unsigned long DEBOUNCE_DELAY = 300;

const String HALDEX_MESSAGE = "Haldex ";
const String HALDEX_TEMP_TOO_HIGH = "Haldex Disabled";

/* Button Pins */
const int UpButtonPin = 2;
const int DownButtonPin = 3;

// ************** use the 4 bit parallel interface ****************
#include <LiquidCrystal.h>
//LCD pin to Arduino
const int pin_RS = 8; 
const int pin_EN = 9; 
const int pin_d4 = 4; 
const int pin_d5 = 5; 
const int pin_d6 = 6; 
const int pin_d7 = 7; 
const int pin_BL = 10; 
LiquidCrystal lcd( pin_RS,  pin_EN,  pin_d4,  pin_d5,  pin_d6,  pin_d7);

/* Definitions for current button state */
typedef enum
{
 E_LCD_BTN_UP,             /* LCD UP button pressed */
 E_LCD_BTN_DOWN,           /* LCD DOWN button pressed */
 E_LCD_BTN_NONE            /* No button pressed */
}
teButtonState;

/* Variables */
int currentHaldexPercentage = 0;
int samples[NUMSAMPLES];
int currentTemp;

unsigned long lastDebounceTime = 0;
unsigned long oilTime;

#line 52 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setup();
#line 65 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void loop();
#line 90 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void disableHaldex();
#line 99 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void writeTempToLCD();
#line 109 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void writeHaldexMessage();
#line 126 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotorForwards(int noOfSteps);
#line 133 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotorBackwards(int noOfSteps);
#line 140 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void moveMotor(int noOfSteps);
#line 151 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
float readTemperature();
#line 172 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void checkButtonPressed();
#line 206 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
int iGetLCDButtonState();
#line 221 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setupLCD();
#line 228 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setupMotor();
#line 52 "\\\\KLSERVER\\dta\\Development\\Stepper Motor\\HaldexWithLCDI2CButtons\\HaldexWithLCDI2CButtons.ino"
void setup()
{
 Serial.begin(9600);

 // Setup the LCD
 setupLCD();

 // Setup the motor driver
 setupMotor();

 oilTime = 0;
}

void loop()
{ 
 // Read the temperature if enough time has passed
 if(millis() - oilTime > OIL_TIME)
 {
   oilTime = millis();
   currentTemp = readTemperature();

   // Update LCD temp
   writeTempToLCD();
 }

 //Check Haldex Temperature
 if(currentTemp > HALDEX_MAX_TEMP)
 {
   disableHaldex();
 }
 else
 // Check if the user has pressed a button
 {
   writeHaldexMessage();
   checkButtonPressed();
 }
}

void disableHaldex()
{
 writeHaldexMessage();
 while(currentHaldexPercentage > 0)
 {
   moveMotorBackwards(HALDEX_STEPS);
 }
}

void writeTempToLCD()
{
 /* Put the LCD cursor on the first row */
 lcd.setCursor(0, 0);

 lcd.print("Temp : ");
 lcd.print(currentTemp);
 lcd.print("*C             ");
}

void writeHaldexMessage()
{
 /* Put the LCD cursor on the second row */
 lcd.setCursor(0, 1);

 if(currentTemp > HALDEX_MAX_TEMP)
 {
   lcd.print(HALDEX_TEMP_TOO_HIGH);
 }
 else
 {
   lcd.print(HALDEX_MESSAGE);
   lcd.print(currentHaldexPercentage);
   lcd.print("%               ");
 }
}

void moveMotorForwards(int noOfSteps)
{
 digitalWrite(DIRECTIONPIN, LOW);
 currentHaldexPercentage += HALDEX_INCREMENT;
 moveMotor(noOfSteps);
}

void moveMotorBackwards(int noOfSteps)
{
 digitalWrite(DIRECTIONPIN, HIGH);
 currentHaldexPercentage -= HALDEX_INCREMENT;
 moveMotor(noOfSteps);
}

void moveMotor(int noOfSteps)
{
 for (int i = 0; i < noOfSteps; i++)
 {
   digitalWrite(STEPPIN, HIGH);
   delay(10);
   digitalWrite(STEPPIN, LOW);
   delay(10);
 }
}

float readTemperature()
{
 uint8_t i;
 float average;

 // take N samples in a row, with a slight delay
 for (i = 0; i < NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
 }

 // average all the samples out
 average = 0;
 for (i = 0; i < NUMSAMPLES; i++) {
   average += samples[i];
 }
 average /= NUMSAMPLES;

 return OILTEMPOFFSET - (average * OILTEMPFACTOR);
}

void checkButtonPressed()
{
 // If the button has been read recently, don't read again
 if((millis() - lastDebounceTime) < DEBOUNCE_DELAY)
 {
   return;
 }
 /* Get the current state of the LCD buttons */
 int buttonState = iGetLCDButtonState();
 switch (buttonState)
 {
   /* If the UP button has been pressed then move the motor forwards */
   case E_LCD_BTN_UP:
     if(currentHaldexPercentage < 100)
     {
       lastDebounceTime = millis();
       moveMotorForwards(HALDEX_STEPS);
       writeHaldexMessage();
     }
     break;

   /* If the DOWN button has been pressed then move the motor backwards */
   case E_LCD_BTN_DOWN:
     if(currentHaldexPercentage >=  HALDEX_INCREMENT)
     {
       lastDebounceTime = millis();
       moveMotorBackwards(HALDEX_STEPS);
       writeHaldexMessage();
     }
     break;
 }
}

/* Read the current state of the LCD buttons using the ADC */
int iGetLCDButtonState()
{
 int iADC_Button_State = E_LCD_BTN_NONE;

 if(digitalRead(UpButtonPin) == HIGH)
 {
   iADC_Button_State = E_LCD_BTN_UP;
 }
 else if(digitalRead(DownButtonPin) == HIGH)
 {
   iADC_Button_State = E_LCD_BTN_DOWN;
 }
 return iADC_Button_State;
}

void setupLCD()
{
 /* Set the correct display size (16 character, 2 line display) */
 lcd.begin(16,2);
 writeHaldexMessage();
}

void setupMotor()
{
 // Set up the motor pins
 pinMode(DIRECTIONPIN, OUTPUT);
 pinMode(STEPPIN, OUTPUT);
 digitalWrite(DIRECTIONPIN, LOW);
 digitalWrite(STEPPIN, LOW);
}

Now the code compiles and the LCD should work.

The LCD shield buttons use a resistor ladder and an analog input so the buttons in the code will not work. You will have to change the code to use the "analog" buttons or re-think using the shield.

In my opinion it would be easier for you to purchase a LCD with an I2C back pack and use the digital buttons as in the original code instead of using the shield. The shield buttons are very different than the buttons intended to be used by the original code.

Ah okay, I see! I’ve just purchased the wrong item then. My mistake

I don’t suppose you could recommend one that would work please?

Thanks for your help!!

I’m UK based but, would this work?

The item that you linked in reply #7 is another shield that uses the 4 bit parallel interface. To work with the original code you need something like this 16x2 LCD with an I2C backpack,

Even if you buy that particular I2C display the LCD to I2C backpack pin mapping and/or I2C address may not be correct. That is easily fixed by replacing the LiquidCrystal_I2C library with the hd44780 library.

Weird. My friend has just taken this screenshot from a video he made.

This is what he used:

No picture.

If he used only the shield* pictured in reply #4 or 7, he did not use the code in your original post. It is just not possible. There is no way that the library for an I2C display will work with the LCD on the shield. And the buttons on the shield can't be used the way that buttons are used in the posted program. On furthe examination of the program, the buttons are the "analog" buttons of the shield.

*I found an Instructable that shows using an I2C backpack and the LCD-keypad shield. The backpack has to be added to the shield and the shield can't be installed onto the Uno. Is this what he did?

savagesam117:
I've installed the HD4780 library and i can't get anything from it, examples wont show. it all uploads onto the device, but nothing but my green blocks on the display. I'm rubbish with electronics :frowning:

I'm guessing that you did not run the examples from the hd44780_pinIO class?

That shield does not use a PCF8574 based backpack so you must use the pinIO class that controls the LCD using Arduino pins.

--- bill

groundFungus:
On furthe examination of the program, the buttons are the "analog" buttons of the shield.

It doesn't appear that way to me.
The comments in the code about using the ADC does not match the actual code.
The code uses digitalRead() on digital pins 2 and 3

/* Button Pins */
const int UpButtonPin = 2;
const int DownButtonPin = 3;

/* Read the current state of the LCD buttons using the ADC */
int iGetLCDButtonState()
{
  int iADC_Button_State = E_LCD_BTN_NONE;
 
  if(digitalRead(UpButtonPin) == HIGH)
  {
    iADC_Button_State = E_LCD_BTN_UP;
  }
  else if(digitalRead(DownButtonPin) == HIGH)
  {
    iADC_Button_State = E_LCD_BTN_DOWN;
  }
  return iADC_Button_State;
}

Also, the way the code is written it depends on external pull down resistors on the pins.

Thre is no way of knowing but it might be that the code was originally for a LCD keypad shield, but was then changed/modified for some other h/w that used an i2c backpack and added some buttons with pull downs on multiple pins instead of a ladder network on a analog pin like the keypad shield.

Whatever the case, the code shown, cannot work the the h/w that is being used.

--- bill

but was then changed/modified for some other h/w that used an i2c backpack and added some buttons with pull downs on multiple pins instead of a ladder network on a analog pin like the keypad shield.

That has been my thinking, and that is why I recommended that, if they wish to use the original code, they buy a LCD with the I2C backpack and use the hd44780 library. The OP says that the original user and author of the code (?) says that he used a shield.

I provided to the OP code for the 4 bit parallel interface, but he never said, for sure, whether it worked or not.

groundFungus:
That has been my thinking, and that is why I recommended that, if they wish to use the original code, they buy a LCD with the I2C backpack and use the hd44780 library. The OP says that the original user and author of the code (?) says that he used a shield.

I have seen some vendors and people call an i2c LCD backpack an "LCD shield".

But the comments in the code about using an ADC (that doesn't match the current code) seem to indicate past usage on a LCD Keypad shield.

--- bill

The pictures don’t load for some reason.

Here’s a screen shot from a video he sent me.

I do have the other components, and can show a picture albeit a bad one, of the circuit

That is the DF Robot shield. It is not I2C so something is mixed up.

I’ll see if I can get hold of him and see what’s going on. Thank you for your help

This topic was automatically closed after 120 days. New replies are no longer allowed.