Error converting arduino to platform io (C++) : identifier "D21" is undefined

I’ve been having issues converting Arduino code to Platform IO. I’ve corrected one script but not really sure how i have done this. I’ve read the documentation but i must be missing something.

The errors im getting are :

identifier “D21” is undefined
identifier “D22” is undefined
identifier “DISPLAY_WIDTH” is undefined
identifier “DISPLAY_WIDTH” is undefined
identifier “DISPLAY_HEIGHT” is undefined

The code is here :

/*===========================================================================
Title: I2C Scanner
- Repository: Arduino_I2C-Scanner - i2c scanner for Arduino hardware, ESP8266, ESP32 · GitHub

Version: 8
Date: 2018 / 02 / 17
Author: Austin St. Aubin
Email: AustinSaintAubin@gmail.com

Description:
Scans for i2c Devices

Version History:
Version 8
Added preprocessor statments for display
Version 6
Added i2c Ports
Added OLED output
Version 5, March 28, 2013
As version 4, but address scans now to 127.
A sensor seems to use address 120.
Version 4, March 3, 2013, Using Arduino 1.0.3
by Arduino.cc user Krodal.
Changes by louarnold removed.
Scanning addresses changed from 0…127 to 1…119,
according to the i2c scanner by Nick Gammon
Gammon Forum : Electronics : Microprocessors : I2C - Two-Wire Peripheral Interface - for Arduino
Version 3, Feb 26 2013
V3 by louarnold
Version 2, Juni 2012, Using Arduino 1.0.1
Adapted to be as simple as possible by Arduino.cc user Krodal
Version 1
This program (or code that looks like it)
can be found in many places.
For example on the Arduino.cc forum.
The original author is not known.

Notes:

This sketch tests the standard 7-bit addresses
Devices with higher bit address might not be seen properly.

============================================================================= */

// [# Preprocessor Statements #]
#define OLED_DISPLAY true // Enable OLED Display
#define OLED_DISPLAY_SSD1306 // OLED Display Type: SSD1306(OLED_DISPLAY_SSD1306) / SH1106(OLED_DISPLAY_SH1106), comment this line out to disable oled

// [ Included Library’s ]
#include <Wire.h>

// Initialize the OLED display using I2C
#ifdef OLED_DISPLAY_SSD1306
#include “SSD1306.h” // alias for #include "SSD1306Wire.h"
#elif defined OLED_DISPLAY_SH1106
#include “SH1106.h” // alias for #include "SH1106Wire.h"
#elif !OLED_DISPLAY
#warning “OLED Display Disabled”
#else
#error “Undefined OLED Display Type”
#endif
/*For a connection via I2C using brzo_i2c (must be installed) include
#include <brzo_i2c.h> Only needed for Arduino 1.6.5 and earlier
#include “SSD1306Brzo.h”
#include “SH1106Brzo.h”
For a connection via SPI include
#include <SPI.h> Only needed for Arduino 1.6.5 and earlier
#include “SSD1306Spi.h”
#include “SH1106SPi.h”
*/

// [ Global Pin Constants / Varables ]
/*Initialize the OLED display using SPI
D5 → CLK
D7 → MOSI (DOUT)
D0 → RES
D2 → DC
D8 → CS */
const uint8_t I2C_SDA_PIN = D21; //SDA; // i2c SDA Pin
const uint8_t I2C_SCL_PIN = D22; //SCL; // i2c SCL Pin

// [ Global Classes ]
#ifdef OLED_DISPLAY_SSD1306
SSD1306 display(0x3c, I2C_SDA_PIN, I2C_SCL_PIN);
#elif defined OLED_DISPLAY_SH1106
SH1106 display(0x3c, I2C_SDA_PIN, I2C_SCL_PIN);
#endif

void setup()
{
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);

// Serial
Serial.begin(115200);
Serial.println(“\nI2C Scanner”);

// OLED
#if OLED_DISPLAY
display.init();
display.flipScreenVertically();
display.setContrast(255);
display.setFont(ArialMT_Plain_10);
display.setColor(WHITE);
// - - - - - - - - - - - - - -
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(DISPLAY_WIDTH, 0, “v8”);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, “I2C Scanner w/ OLED”);
// - - - - - - - - - - - - - -
display.drawLine(0, 12, DISPLAY_WIDTH, 12);
// - - - - - - - - - - - - - -
display.display();
#endif
}

void loop()
{
byte error, address;
int nDevices;

Serial.println(“Scanning…”);

#if OLED_DISPLAY
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 14, “Scanning…”);
display.display();
#endif

nDevices = 0;
for(address = 1; address < 127; address++ ) {
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0) {
  nDevices++;

  Serial.print("Device found @ 0x");
  if (address<16)
    Serial.print("0");
  Serial.print(address,HEX);
  Serial.println("  !");

  #if OLED_DISPLAY
    display.drawString(((nDevices -1) % 4) * 32, 23 + (round((nDevices -1) /4) *10), (String)nDevices + ":x" + String(address, HEX));
    display.display();
  #endif
}
else if (error==4)
{
  Serial.print("Unknow error @ 0x");
  if (address<16)
    Serial.print("0");
  Serial.println(address,HEX);

  #if OLED_DISPLAY
    display.drawString(((nDevices -1) % 4) * 32, 23 + (round((nDevices -1) /4) *10), "!:x" + String(address, HEX));
    display.display();
  #endif
}

}
if (nDevices == 0) {
Serial.println(“No I2C devices found\n”);

#if OLED_DISPLAY
    display.drawString(0, 23 , "No I2C devices found");
    display.display();
#endif

} else {
Serial.println(“done\n”);

#if OLED_DISPLAY
    display.drawString(((nDevices -0) % 4) * 32, 23 + (round((nDevices -0) /4) *10), "done");
    display.display();
#endif

}

// DEBUGING
// for(address = 40; address < 52; address++ ) {
// nDevices++;
// display.drawString(((nDevices -1) % 4) * 32, 23 + (round((nDevices -1) /4) *10), (String)nDevices + “:x” + String(address, HEX));
// Serial.println(address,HEX);
// }

delay(5000); // wait 5 seconds for next scan

#if OLED_DISPLAY
// Clear Bottom of Display
display.setColor(BLACK);
display.fillRect(0, 13, DISPLAY_WIDTH, DISPLAY_HEIGHT - 13);
display.setColor(WHITE);
#endif
}

Did the code work in the arduino IDE? Somewhere there has to be as file that defines those macros.
You can achieve that by adding a few lines at the top of your code.

#define D21 21
#define D22 22
#define DISPLAY_WIDTH <your display width in pixels>   // e.g.: #define DISPLAY_WIDTH 600 
#define DISPLAY_HEIGHT <your display width in pixels>

You need #include <Arduino.h> at the top of CPP file.

1 Like