NHD-0216AW-IB3 with Arduino Uno Code example?
Hi,
As the subject says, I am hoping that someone can offer me an example of using this display via the I2C interface from the Arduino Uno.
I know that there is an example for the Mega. And for the Uno using the SPI interface. Neither of which, I have been able to convert.
Additionally, can I hard-wire the /res line low? Or does it need to be toggled during a setup phase?
Regards, Martin
-
Hello,
You can find the code for this display here: https://github.com/NewhavenDisplay/NHD_US2066
This code will work for both the Arduino Uno and Mega.0 -
This code will work for both the Arduino Uno and Mega.
Thank you for the advice,
Unfortunately it does not work for me?
If I try and compile the example sketch "NHD_0216AW_XB3", yes it will compile without errors for the MEGA,
but when I change my Board to UNO, it will not?
As, it seems, I can not attach a text file with the full compilation output, I offer only the first error seen & hope it provides sufficient clues:/home/mprowe/Arduino/libraries/NHD_US2066/NHD_US2066.cpp: In function 'void command(unsigned char)':
/home/mprowe/Arduino/libraries/NHD_US2066/NHD_US2066.cpp:14:15: error: 'PORTA' was not declared in this scope
PORTA = c;Sorry that my skills do not allow me to debug this on my own. So any pointers will be most welcome.
Regards, Martin0 -
Edit:
Please do not use this use the one on Reply #5
library by Phil Grant 2013 www.gadjet.co.uk
OLedI2C library http://gadjetsblog.blogspot.com/2013/09/oled-1602-display-and-library-for.html
Perhaps this will be of help.
Been long time since I used this Library, createChar function contributed by me.
keywords.txt / OLedI2C.cpp / OLedI2C.h
The 3 files should be in %your arduino dir%\libraries\OLedI2C\
The directory name must match the library name for libraries to work.
NOTE: this is set up for 04x20 oled now.
Look for this in OLedI2C.cpp perhaps you can edit that line for 02x16.
int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };// **************THIS WAS THE CHANGE FOR 4 LINES.keywords.txt
#######################################
# Syntax Coloring Map For OLedI2C
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
OLedI2C KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
init KEYWORD2
sendCommand KEYWORD2
sendString KEYWORD2
sendData KEYWORD2
clearLcd KEYWORD2
cursPos KEYWORD2
setCursor KEYWORD2
createChar KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################OLedI2C.cpp
// 1602-OLED-Arduino-Library/OLedI2C.cpp
// keywords.txt / OLedI2C.cpp / OLedI2C.h
// The 3 files should be in %your arduino dir%\libraries\OLedI2C\
// The directory name must match the library name for libraries to work.
/*
This is my first Library to make writing to the OLED 1602
Display much easier, the display is based on the SSD1311.
The display has 16 characters and 2 lines.
The library is far from complete and may be prone to errors.
Feedback welcome, visit www.gadjet.co.uk
Phil Grant 2013
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data in the sendString function
sendString("string", col, row)
*/
#include "OLedI2C.h"
// NEW
//#include <stdio.h>
//#include <string.h>
//#include <inttypes.h>
//#include "Arduino.h"
#include "Wire.h"
#define OLED_Address 0x3c
#define OLED_Command_Mode 0x80
#define OLED_Data_Mode 0x40
OLedI2C::OLedI2C(){}
OLedI2C::~OLedI2C(){}
void OLedI2C::init() {
// *** I2C initial *** //
delay(100);
sendCommand(0x2A); // **** Set "RE"=1 00101010B
sendCommand(0x71);
sendCommand(0x5C);
sendCommand(0x28);
sendCommand(0x08); // **** Set Sleep Mode On
sendCommand(0x2A); // **** Set "RE"=1 00101010B
sendCommand(0x79); // **** Set "SD"=1 01111001B
sendCommand(0xD5);
sendCommand(0x70);
sendCommand(0x78); // **** Set "SD"=0 01111000B
sendCommand(0x08); // **** Set 5-dot, 3 or 4 line(0x09), 1 or 2 line(0x08)
sendCommand(0x06); // **** Set Com31-->Com0 Seg0-->Seg99
// original:
// **** Set OLED Characterization *** //
// sendCommand(0x2A); // **** Set "RE"=1
// sendCommand(0x79); // **** Set "SD"=1
// **** CGROM/CGRAM Management *** //
// sendCommand(0x72); // **** Set ROM
// sendCommand(0x00); // **** Set ROM A and 8 CGRAM
// **** CGROM/CGRAM Management *** //
sendCommand(0x72); // **** Set ROM
sendData(B00000011); // **** Set ROM A and 8 CGRAM This selects CGROM A, 00000000 selects CGROM C
// **** Set OLED Characterization *** //
sendCommand(0x2A); // **** Set "RE"=1
sendCommand(0x79); // **** Set "SD"=1
sendCommand(0xDA); // **** Set Seg Pins HW Config
sendCommand(0x10);
sendCommand(0x81); // **** Set Contrast
sendCommand(0xFF);
sendCommand(0xDB); // **** Set VCOM deselect level
sendCommand(0x30); // **** VCC x 0.83
sendCommand(0xDC); // **** Set gpio - turn EN for 15V generator on.
sendCommand(0x03);
sendCommand(0x78); // **** Exiting Set OLED Characterization
sendCommand(0x28);
sendCommand(0x2A);
//sendCommand(0x05); // **** Set Entry Mode
sendCommand(0x06); // **** Set Entry Mode
sendCommand(0x08);
sendCommand(0x28); // **** Set "IS"=0 , "RE" =0 //28
sendCommand(0x01);
sendCommand(0x80); // **** Set DDRAM Address to 0x80 (line 1 start)
delay(100);
sendCommand(0x0C); // **** Turn on Display
}
// void OLedI2C::cursPos(uint8_t col, uint8_t row)
// {
// int row_offsets[] = { 0x00, 0x40 };
// sendCommand(0x80 | (col + row_offsets[row]));
// }
void OLedI2C::cursPos(uint8_t col, uint8_t row)
{
int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };// **************THIS WAS THE CHANGE FOR 4 LINES
sendCommand(0x80 | (col + row_offsets[row])); //was 0x80
}
// NEW 03-23-2015
// cloumn, row / setCursor
void OLedI2C::setCursor(uint8_t col, uint8_t row)
{
int row_offsets[] = { 0x00, 0x20, 0x40, 0x60 };// **************
sendCommand(0x80 | (col + row_offsets[row]));
}
void OLedI2C::clearLcd()
{
sendCommand(0x01);
}
void OLedI2C::lcdOff()
{
sendCommand(0x08); // **** Turn on Off
}
void OLedI2C::lcdOn()
{
sendCommand(0x0C); // **** Turn on On
}
void OLedI2C::sendCommand(unsigned char command)
{
Wire.beginTransmission(OLED_Address); // **** Start I2C
Wire.write(OLED_Command_Mode); // **** Set OLED Command mode
Wire.write(command);
Wire.endTransmission(); // **** End I2C
delay(10);
}
void OLedI2C::sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row)
{
char line[10];//Ten characters, I hope that's enough
dtostrf(digit,dec,nad,line);//Convert the float value to a string
sendString(line, col, row);
}
void OLedI2C::setContrast(unsigned char contrast) // contrast as 0x00 to 0xFF
{
//Set OLED Command set
sendCommand(0x2A);
sendCommand(0x79);
sendCommand(0x81); // Set Contrast
sendCommand(contrast); // send contrast value
sendCommand(0x78); // Exiting Set OLED Command set
sendCommand(0x28);
}
void OLedI2C::sendString(const char *String, uint8_t col, uint8_t row)
{
cursPos(col, row);
unsigned char i=0;
while(String[i])
{
sendData(String[i]); // *** Show String to OLED
i++;
}
}
void OLedI2C::sendData(unsigned char data)
{
Wire.beginTransmission(OLED_Address); // **** Start I2C
Wire.write(OLED_Data_Mode); // **** Set OLED Data mode
Wire.write(data);
Wire.endTransmission(); // **** End I2C
}
void OLedI2C::scrollString(char* message, byte row, unsigned int time)//written by Nathan Chantrell http://nathan.chantrell.net/
{
char buffer[16];
for (byte i=0;i<strlen(message)+16;i++) {
byte pos = i+1;
for (byte j=0;j<16;j++) {
if ((pos<16)||(pos>strlen(message)+15)) { // pad and trail with blank spaces
buffer[j]=' ';
}
else buffer[j]=message[pos-16];
pos++;
}
//cursPos(0,row); removed by PG
sendString(buffer, 0, row); //Edited by PG tho include the cursor pos within the sendString command
delay(time);
}
}
// NEW 03-31-2015
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void OLedI2C::createChar(uint8_t location, uint8_t charmap[])
{
location &= 0x7; // we only have 8 locations 0-7
sendCommand(0x40 | (location << 3));
delayMicroseconds(30);
for (int i=0; i<8; i++)
{
sendData(charmap[i]); // call the virtual write method
delayMicroseconds(40);
}
}OLedI2C.h
// 1602-OLED-Arduino-Library/OLedI2C.h
/*
OLedI2C.h
OLED 1602 Library for the I2C
OLED display from WIDE.HK
Also my first attempt at a Library
Phil Grant Sept 2013
www.gadjet.co.uk
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data within the sendString function.
*/
#ifndef OLedI2C_h
#define OLedI2C_h
#include "Arduino.h"
#include "Wire.h"
class OLedI2C {
public:
OLedI2C();
~OLedI2C();
void init();
void sendCommand(unsigned char command);
void sendString(const char *String, uint8_t col, uint8_t row);
void sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row);
void sendData(unsigned char data);
void clearLcd();
void cursPos(uint8_t, uint8_t); // cloumn, row
void setCursor(uint8_t, uint8_t); // NEW 03-23-2015 / cloumn, row / setCursor
void scrollString(char* message, byte row, unsigned int time); //written by Nathan Chantrell http://nathan.chantrell.net/
void lcdOff();
void lcdOn();
void setContrast(unsigned char contrast); // contrast should be the hex value between 0x00 and 0xFF
void createChar(uint8_t, uint8_t[]); // NEW 03-23-2015 / Allows us to fill the first 8 CGRAM locations with custom characters
};
#endifExample
// I2C Wire Library Newhaven Display NHD-0420CW OLED TEST
// Wire Library, This library allows you to communicate with I2C / TWI devices
// Board I2C / TWI pins
// Uno, Ethernet A4 (SDA), A5 (SCL)
// Mega2560 20 (SDA), 21 (SCL)
// Leonardo 2 (SDA), 3 (SCL)
// Due 20 (SDA), 21 (SCL), SDA1, SCL1
//Teensy 3.0/3.1 18 (SDA), 19 (SCL),Back Side 30 (SDA1), 29 (SCL1)
#include <Wire.h>
#define I2C_ADDR 0x3c // Define I2C Address, 0x3c or 0x3d
#include <OLedI2C.h>
OLedI2C LCD;
// custom font arrays
byte newChar1[8] = {
B11011,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B10101
};
byte newChar2[8] = {
B10000,
B01000,
B00101,
B00100,
B00100,
B00101,
B01000,
B10000
};
byte newChar3[8] = {
B10001,
B01010,
B01110,
B00100,
B00100,
B01110,
B01010,
B10001
};
byte newChar4[8] = {
B11111,
B11111,
B11111,
B00100,
B00100,
B11111,
B11111,
B11111
};
byte newChar5[8] = { // 5TH custom font
B10101,
B10000,
B10110,
B00001,
B00000,
B10001,
B01010,
B00000
};
void setup() {
Wire.begin(); // Start Wire Library
LCD.init(I2C_ADDR); // initialize the lcd with I2C Address
//delay(1000);
// Store custom font data in 420CW Oled
LCD.createChar(0, newChar1);
LCD.createChar(1, newChar2);
LCD.createChar(2, newChar3);
LCD.createChar(3, newChar4);
LCD.createChar(4, newChar5);
LCD.createChar(5, newChar5);
LCD.createChar(6, newChar5);
LCD.createChar(7, newChar5);
LCD.sendString("SETUP ()", 0, 0); //("String", col, row)
delay(1000);
}
void loop() {
//////////// set Contrast test 1 ////////////////
LCD.sendString("set Contrast test DW", 0, 0); //("String", col, row)
for (int Contrast = 255; Contrast > 0; Contrast = Contrast-- / 2 ) {
LCD.setContrast(Contrast); // Set Contrast (Minimum allowed 0) 0~255
LCD.setCursor(9,1); //(col,row)
LCD.print(Contrast);
LCD.print(" "); //clear
delay(300); //delay not necessary as its sending a lot of Commands wich has delay inside the lib.
}
delay(2000); // 2sec. delay
LCD.clearLcd();
LCD.sendString("set Contrast test UP", 0, 0); //("String", col, row)
for (int Contrast = 0; Contrast < 510; Contrast = Contrast++ * 2 ) {
LCD.setContrast(Contrast); // Set Contrast (Minimum allowed 0) 0~255
LCD.cursPos(9,1); //(col,row)
LCD.print(Contrast);
LCD.print(" "); //clear
delay(300); //delay not necessary as its sending a lot of Commands wich has delay inside the lib.
}
delay(2000); // 2sec. delay
LCD.clearLcd();
// Double Height(4-line) Test
LCD.sendString("Double Height(4x20)", 0, 0);
LCD.sendString("Test", 8, 1);
delay(2000); // 2sec. delay
LCD.setDoubleH(1);
LCD.sendString("MODE 1", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(2);
LCD.sendString("MODE 2", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(3);
LCD.sendString("MODE 3", 0, 1);
delay(1000); // 1sec. delay
LCD.sendString(" ", 0, 1); // clear MODE 3 from Oled
LCD.setDoubleH(4);
LCD.sendString("MODE 4", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(0); //back to 4x20
LCD.sendString("MODE 0 (4-line)", 0, 2);
delay(3000); // 3sec. delay
LCD.clearLcd();
//////////// Print custom font Using Wire.h Library test 2 ////////////////
LCD.setDoubleH(3); // MODE 1
LCD.sendString("Print custom font / Wire Library", 0, 0); //("String", col, row)
LCD.sendString("custom font -->", 0, 3);
delay(3000); // 1sec. delay
LCD.setDoubleH(0);
delay(1000); // 1sec. delay
LCD.cursPos(16,3); //(col,row) / set up position
// Test / Print custom font 5 using Wire.h Library
Wire.beginTransmission(I2C_ADDR); // start condition + Define I2C Address where the US2066 is, and set R/W# bit to logic “0” write mode.
// Print custom font
Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
//Wire.write(B00000011); //DEC 3 // print custom font 4 [8bit (hi bit 0000/low bit 0011
Wire.write(4); //DEC 4 / 5th custom font (Zero based array indexing.....)
Wire.endTransmission(); // stop condition / 7) The write mode will be finished when a stop condition is applied.
delay(3000); // 3sec. delay
LCD.clearLcd();
delay(1000); //1sec. delay
//////////// Print 2 custom font Using LCD.sendData test 3 ////////////////
LCD.sendString(" Print two custom fonts / LCD.sendData", 0, 0); //("String", col, row)
LCD.cursPos(2,2); //(col,row)
LCD.print("---> ");
delay(1000); // 1sec. delay
LCD.sendData(0); //Print custom font 1 (Zero based array indexing.....)
LCD.print(" <---> ");
delay(1000); // 1sec. delay
LCD.sendData(char(1)); //Print custom font 2
delay(3000); // 3sec. delay
LCD.clearLcd();
delay(1000);
//LCD.scrollString("test", 2, 100);
//////////// command test ////////////////
/*
sendCommand(0x2A);//function set (extended command set)
sendCommand(0x71); //function selection A
sendData(0x00); //disable internal VDD regulator (2.8V I/O). data(0x5C) = enable regulator (5V I/O)
sendCommand(0x28); //function set (fundamental sendCommand set)
sendCommand(0x08); //display off, cursor off, blink off
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xD5); //set display clock divide ratio/oscillator frequency
sendCommand(0x70); //set display clock divide ratio/oscillator frequency
sendCommand(0x78); //OLED command set disabled
sendCommand(0x09); //extended function set (4-lines) / last bit=1 : 3-line or 4-line display mode
sendCommand(0x06); //COM SEG direction
sendCommand(0x72); //function selection B
sendData(B00000000); //ROM CGRAM selection
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xDA); //set SEG pins hardware configuration
sendCommand(0x10); //set SEG pins hardware configuration
sendCommand(0xDC); //function selection C
sendCommand(0x00); //function selection C
sendCommand(0x81); //set contrast control
sendCommand(0x7F); //set contrast control
sendCommand(0xD9); //set phase length
sendCommand(0xF1); //set phase length
sendCommand(0xDB); //set VCOMH deselect level
sendCommand(0x40); //set VCOMH deselect level
sendCommand(0x78); //OLED command set disabled
sendCommand(0x28); //function set (fundamental command set)
sendCommand(0x01); //clear display
sendCommand(0x80); //set DDRAM address to 0x00
sendCommand(0x0C); //display ON
delay(150);
sendCommand(0x0C); // **** Turn on Display
delay(150);*/
}« Last Edit: May 10, 2017, 07:20:32 PM by Chris O. »0 -
Thank you Chris,
Think I have installed the libraries & example correctly. But....
Isn't there always? Anyway, this is what I get (abridged) when I try to compile:
/home/mprowe/Arduino/libraries/OLedI2C/OLedI2C.h:22:8: note: void OLedI2C::init()
void init();
^
/home/mprowe/Arduino/libraries/OLedI2C/OLedI2C.h:22:8: note: candidate expects 0 arguments, 1 providedThis is the faulting line (should I2C_ADDR be there?):
LCD.init(I2C_ADDR); // initialize the lcd with I2C Address
There is also a call to LCD.print (line 98) which is not in the library.
Regards, Martin0 -
Whoops it appears I have more than one of these libraries all over in different Arduino installations .
Well this time I did test it and it compiles, i hate to do this to you but you have to try again with these files.
keywords.txt / OLedI2C.cpp / OLedI2C.h
The 3 files should be in %your arduino dir%\libraries\OLedI2C\
The directory name must match the library name for libraries to work.
OLedI2C.cpp// 1602-OLED-Arduino-Library/OLedI2C.cpp
// keywords.txt / OLedI2C.cpp / OLedI2C.h
// The 3 files should be in %your arduino dir%\libraries\OLedI2C\
// The directory name must match the library name for libraries to work.
/*
This is my first Library to make writing to the OLED 1602
Display much easier, the display is based on the SSD1311.
The display has 16 characters and 2 lines.
The library is far from complete and may be prone to errors.
Feedback welcome, visit www.gadjet.co.uk
Phil Grant 2013
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data in the sendString function
sendString("string", col, row)
*/
#include "OLedI2C.h"
#if (ARDUINO < 100)
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#include "Wire.h"
////////////////#define OLED_Address 0x3c
#define OLED_Command_Mode 0x80
#define OLED_Data_Mode 0x40
OLedI2C::OLedI2C(){
}
OLedI2C::~OLedI2C(){
}
uint8_t _OLED_Address; //global variable initialization
void OLedI2C::init(uint8_t OLED_Address) {
_OLED_Address = OLED_Address;
// *** I2C initial *** //
delay(100);
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x71); //function selection A
sendData(0x00); // disable internal VDD regulator (2.8V I/O). data(0x5C) = enable regulator (5V I/O)
sendCommand(0x28); //function set (fundamental sendCommand set)
sendCommand(0x08); //display off, cursor off, blink off
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xD5); //set display clock divide ratio/oscillator frequency
sendCommand(0x70); //set display clock divide ratio/oscillator frequency
sendCommand(0x78); //OLED command set disabled
sendCommand(0x09); //extended function set 4 line
sendCommand(0x06); //COM SEG direction
sendCommand(0x72); //function selection B
sendData(0x00); //ROM CGRAM selection
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xDA); //set SEG pins hardware configuration
sendCommand(0x10); //set SEG pins hardware configuration
sendCommand(0xDC); //function selection C
sendCommand(0x00); //function selection C
sendCommand(0x81); //set contrast control
sendCommand(0x7F); //set contrast control
sendCommand(0xD9); //set phase length
sendCommand(0xF1); //set phase length
sendCommand(0xDB); //set VCOMH deselect level
sendCommand(0x40); //set VCOMH deselect level
sendCommand(0x78); //OLED command set disabled
sendCommand(0x28); //function set (fundamental command set)
sendCommand(0x01); //clear display
sendCommand(0x80); //set DDRAM address to 0x00
sendCommand(0x0C); //display ON
delay(150);
sendCommand(0x0C); // **** Turn on Display
delay(150);
}
// void OLedI2C::cursPos(uint8_t col, uint8_t row)
// {
// int row_offsets[] = { 0x00, 0x40 };
// sendCommand(0x80 | (col + row_offsets[row]));
// }
void OLedI2C::cursPos(uint8_t col, uint8_t row)
{
int row_offsets[] = {
0x00, 0x20, 0x40, 0x60 };// **************THIS WAS THE CHANGE FOR 4 LINES
sendCommand(0x80 | (col + row_offsets[row])); //was 0x80
}
// NEW 03-23-2015
// cloumn, row / setCursor
void OLedI2C::setCursor(uint8_t col, uint8_t row)
{
int row_offsets[] = {
0x00, 0x20, 0x40, 0x60 };// **************
sendCommand(0x80 | (col + row_offsets[row]));
}
void OLedI2C::clearLcd()
{
sendCommand(0x01);
}
// arduino com.
void OLedI2C::clear() // *********Compatible with LiquidCrystal lib.
{
sendCommand(0x01);
}
void OLedI2C::home()
{
sendCommand(0x02);
}
void OLedI2C::lcdOff()
{
sendCommand(0x08); // **** Turn on Off
}
void OLedI2C::lcdOn()
{
sendCommand(0x0C); // **** Turn on On
}
void OLedI2C::noDisplay() // *********Compatible with LiquidCrystal lib.
{
sendCommand(0x08); // **** Turn on Off
}
void OLedI2C::display() // *********Compatible with LiquidCrystal lib.
{
sendCommand(0x0C); // **** Turn on On
}
// Turns the underline cursor on/off
void OLedI2C::noCursor() {
sendCommand(0x0C); // **** Turn Off underline cursor
}
void OLedI2C::cursor() {
sendCommand(0x0E); // **** Turn On underline cursor
}
// Turn on and off the blinking cursor
void OLedI2C::noBlink() {
sendCommand(0x0C); // **** Turn Off blinking cursor
}
void OLedI2C::blink() {
sendCommand(0x0D); // **** Turn On blinking cursor
}
void OLedI2C::sendCommand(unsigned char command)
{
Wire.beginTransmission(_OLED_Address); // **** Start I2C
Wire.write(OLED_Command_Mode); // **** Set OLED Command mode
Wire.write(command);
Wire.endTransmission(); // **** End I2C
}
// ARDUINO 0.23 ~ ARDUINO 1.0.0 and Up ======= Print ==============================================
#if (ARDUINO < 100)
inline void OLedI2C::write(uint8_t value) {
sendData(value);
}
#else
inline size_t OLedI2C::write(uint8_t value) {
sendData(value);
}
#endif
void OLedI2C::setDoubleH(uint8_t MODE) // 09-19-2015 / Double Height Display MODE 0~4
// MODE: "0"=Normal 4-line, "1"=Bottom half Double Height, "2"=Middle Double Height, "3"=Top/Bottom Double Height, "4"=Top Double Height
{
sendCommand(0x2A);// Function Set (extended command set / Extension register, RE ("1")set) B00101010
sendCommand(B00001001);//Extended Function Set (FW = "0": 5-dot font width, black/white invert cursor DIS,NW = "1": 3-line or 4-line display mode)
switch (MODE) {
case 0: //MODE 0 4x20-line
sendCommand(0x28);// Function Set (Go Back to Fundamental Command Set)//101000
break;
case 1: //MODE 1 0x10 / Double Height (4-line)/Display-dot shift
sendCommand(B00010000); //MODE 2
sendCommand(0x2C);//101100 Function Set ( when (N=1 :4-line )and(NW=1), Double height =1 Enable, Extension register, RE"0", Extension register, IS"0" )
break;
case 2: //MODE 2 0x14 / Double Height (4-line)/Display-dot shift
sendCommand(B00010100); //MODE 2 0x14 / Double Height (4-line)/Display-dot shift
sendCommand(0x2C);//101100 Function Set ( when (N=1 :4-line )and(NW=1), Double height =1 Enable, Extension register, RE"0", Extension register, IS"0" )
break;
case 3: //MODE 3 0x18 / Double Height (4-line)/Display-dot shift (DH’ = "0": dot scroll enable (POWER UP))
sendCommand(B00011000);
//sendCommand(B00011001); //MODE 3 0x19 / Double Height (4-line)/Display-dot shift (DH’ = "1": display shift enable)
sendCommand(0x2C);//101100 Function Set ( when (N=1 :4-line )and(NW=1), Double height =1 Enable, Extension register, RE"0", Extension register, IS"0" )
break;
case 4:
sendCommand(B00011100); //MODE 4 0x1C / Double Height (4-line)/Display-dot shift(DH’ = "0": display shift DIS)
sendCommand(0x2C);//101100 Function Set ( when (N=1 :4-line )and(NW=1), Double height =1 Enable, Extension register, RE"0", Extension register, IS"0" )
break;
}
}
void OLedI2C::sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row)
{
char line[10];//Ten characters, I hope that's enough
dtostrf(digit,dec,nad,line);//Convert the float value to a string
sendString(line, col, row);
}
void OLedI2C::setContrast(unsigned char contrast) // contrast as 0x00 to 0xFF
{
//Set OLED Command set
sendCommand(0x2A); //Function Set N = 1, BE = 0, RE = 1 Set, REV = "0": normal display (POR) B00101010
sendCommand(0x79); //OLED Characterization / 0x79 B1111001 = OLED command set is enabled
sendCommand(0x81); // Set Contrast
sendCommand(contrast); // send contrast value
sendCommand(0x78); // OLED Characterization / 0x78 B1111000 =Exiting Set OLED Command set disabled (POR)
sendCommand(0x28); // Function Set / B101000 (Go Back to Fundamental Command Set)
}
void OLedI2C::sendString(const char *String, uint8_t col, uint8_t row)
{
cursPos(col, row);
unsigned char i=0;
while(String[i])
{
sendData(String[i]); // *** Show String to OLED
i++;
}
}
void OLedI2C::sendData(unsigned char data)
{
Wire.beginTransmission(_OLED_Address); // **** Start I2C
Wire.write(OLED_Data_Mode); // **** Set OLED Data mode
Wire.write(data);
Wire.endTransmission(); // **** End I2C
}
void OLedI2C::scrollString(char* message, byte row, unsigned int time)//written by Nathan Chantrell http://nathan.chantrell.net/
{
char buffer[16];
for (byte i=0;i<strlen(message)+16;i++) {
byte pos = i+1;
for (byte j=0;j<16;j++) {
if ((pos<16)||(pos>strlen(message)+15)) { // pad and trail with blank spaces
buffer[j]=' ';
}
else buffer[j]=message[pos-16];
pos++;
}
//cursPos(0,row); removed by PG
sendString(buffer, 0, row); //Edited by PG tho include the cursor pos within the sendString command
delay(time);
}
}
//#define OLED_Command_Mode 0x80
//#define OLED_Data_Mode 0x40
// NEW 03-23-2015
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void OLedI2C::createChar(uint8_t location, uint8_t charmap[])
{
location &= 0x7; // we only have 8 locations 0-7
//Wire.beginTransmission(_OLED_Address);
//Wire.write(OLED_Data_Mode | (location << 3)); // SETCGRAMADDR 0x40 [ Wire.write(B01000000); ]
//Wire.endTransmission();
Wire.beginTransmission(_OLED_Address); // **** Start I2C
Wire.write(OLED_Command_Mode); // 0x80
Wire.write(0x40 | (location << 3)); // **** Set OLED Command mode
Wire.endTransmission(); // **** End I2C
for (uint8_t i = 0 ; i < 8 ; i++) {
Wire.beginTransmission(_OLED_Address); // **** Start I2C
Wire.write(OLED_Data_Mode); // **** Set OLED Data mode
Wire.write(charmap[i]);
Wire.endTransmission();
}
}
/*
// NEW 03-31-2015
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void OLedI2C::createChar(uint8_t location, uint8_t charmap[])
{
location &= 0x7; // we only have 8 locations 0-7
sendCommand(0x40 | (location << 3));
for (int i=0; i<8; i++)
{
sendData(charmap[i]); // call the virtual write method
}
}
*/OLedI2C.h
// 1602-OLED-Arduino-Library/OLedI2C.h
/*
OLedI2C.h
OLED 1602 Library for the I2C
OLED display from WIDE.HK
Also my first attempt at a Library
Phil Grant Sept 2013
www.gadjet.co.uk
Scrolling contributed by Nathan Chantrell http://nathan.chantrell.net/
Updated 06/11/2013 to include the cursPos data within the sendString function.
*/
#ifndef OLedI2C_h
#define OLedI2C_h
#include "Arduino.h"
#include "Wire.h" // NEED FIX
//#include <i2c_t3.h> //Enhanced I2C library for Teensy 3.0/3.1/LC devices
#include "Print.h"
class OLedI2C : public Print {
public:
OLedI2C();
~OLedI2C();
// void init(); // OLD
void init(uint8_t OLED_Address);
void sendCommand(unsigned char command);
void sendString(const char *String, uint8_t col, uint8_t row);
void sendFloat(float digit, uint8_t dec, uint8_t nad, uint8_t col, uint8_t row);
void sendData(unsigned char data);
void clearLcd();
void clear();
void home();
void noDisplay();
void display();
void noCursor();
void cursor();
void noBlink();
void blink();
void cursPos(uint8_t, uint8_t); // cloumn, row
void setCursor(uint8_t, uint8_t); // *********Compatible with LiquidCrystal lib.
void setCursor2(uint8_t, uint8_t); // 03-23-2015 / cloumn, row / setCursor
void scrollString(char* message, byte row, unsigned int time); //written by Nathan Chantrell http://nathan.chantrell.net/
void lcdOff();
void lcdOn();
void setDoubleH(uint8_t); // 09-19-2015 / Double Height Display MODE 0~4
void setContrast(uint8_t contrast); // contrast should be the hex value between 0x00 and 0xFF
void createChar(uint8_t, uint8_t[]); // NEW 03-23-2015 / Allows us to fill the first 8 CGRAM locations with custom characters
// Compatible = ARDUINO= 0.23 = 1.6.5 ================
#if (ARDUINO < 100)
virtual void write(uint8_t);
#else
virtual size_t write(uint8_t);
#endif // my code ==========================
};
#endifkeywords.txt
#######################################
# Syntax Coloring Map For OLedI2C
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
OLedI2C KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
init KEYWORD2
sendCommand KEYWORD2
sendData KEYWORD2
sendString KEYWORD2
sendFloat KEYWORD2
clearLcd KEYWORD2
clear KEYWORD2
home KEYWORD2
noDisplay KEYWORD2
display KEYWORD2
noCursor KEYWORD2
cursor KEYWORD2
noBlink KEYWORD2
blink KEYWORD2
cursPos KEYWORD2
setCursor KEYWORD2
createChar KEYWORD2
scrollString KEYWORD2
lcdOn KEYWORD2
lcdOff KEYWORD2
setContrast KEYWORD2
setDoubleH KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################Another example
/*
Example sketch to display Strings and float values on the OLED
1602 display from Wide.HK. This uses a Lbrary that I've
put together containing some basic functions.
The I2C Address is set to 0x3C in OLedI2C.cpp
Phil Grant 2013 www.gadjet.co.uk 07/11/13
*/
#include "Wire.h"
#include "OLedI2C.h"
OLedI2C LCD;
#define I2C_ADDR 0x3c // Define I2C Address, 0x3c or 0x3d
float digit; //Variable to hold sample temperature value
void setup()
{
Wire.begin();
LCD.init(I2C_ADDR); // initialize the lcd with I2C Address
digit = 21.6; //This would normally be the float value returned from a temp sensor or other sensor
}
void loop()
{
LCD.sendString("Temp", 0, 0); //Now includes the cursor position data (col, row)
LCD.sendFloat(digit, 5, 2, 7, 0); //Send the float value to the display starting
//at col 7 row 1 with 5 digits and 2 decimal places
while (1);
}Also the I2C address 0x3c may need to be edit for the screen you use.
Just run this and open the serial monitor it should show you the correct address.i2c_scanner
// i2c_scanner
//
// 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 know.
//
// This sketch tests the standard 7-bit addresses
// from 0 to 127. Devices with higher bit address
// might not be seen properly.
//
// Adapted to be as simple as possible by Arduino.cc user Krodal
//
// June 2012
// Using Arduino 1.0.1
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 0; 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)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(8000); // wait 8 seconds for next scan
}« Last Edit: May 10, 2017, 07:15:15 PM by Chris O. »0 -
Oh, I'm really sorry Chris,
But it is still no-go for me! I've pasted the first few "red" lines below. Is there a more effective way to give you the compilation log?
The message in the Arduino IDE output window is "Error compiling for board Arduino/Genuino Uno" - This is where I started?Linking everything together...
"/home/mprowe/.arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/avr-gcc" [... truncated ...]
/tmp/ccnQrlgR.ltrans0.ltrans.o: In function `__static_initialization_and_destruction_0':
/home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:11: undefined reference to `OLedI2C::OLedI2C()'
/tmp/ccnQrlgR.ltrans0.ltrans.o: In function `setup':Regards, Martin
0 -
Sorry for the late reply but it does appear you have the library not installed correctly.
Is there a more effective way to give you the compilation log?
You can enabled this; Show verbose output during Compilation and Upload enabled in File > Preferences.
The undefined reference to OLedI2C::OLedI2C() seems to be showing up because the example is trying to look for OLedI2C in nhd-i2c folder.
This is the last four lines of my successful compilation:Using library Wire at version 1.0 in folder: C:\Documents and Settings\USER NAME HERE\Desktop\arduino-1.8.1\hardware\arduino\avr\libraries\Wire
Using library OLedI2C in folder: C:\Documents and Settings\USER NAME HERE\Desktop\arduino-1.8.1\libraries\OLedI2C (legacy)
Sketch uses 3640 bytes (11%) of program storage space. Maximum is 32256 bytes.
Global variables use 294 bytes (14%) of dynamic memory, leaving 1754 bytes for local variables. Maximum is 2048 bytes.Test code used:
// library by Phil Grant 2013 www.gadjet.co.uk
// OLedI2C library http://gadjetsblog.blogspot.com/2013/09/oled-1602-display-and-library-for.html
// I2C Wire Library Newhaven Display NHD-0420CW OLED TEST
// Wire Library, This library allows you to communicate with I2C / TWI devices
// Board I2C / TWI pins
// Uno, Ethernet A4 (SDA), A5 (SCL)
// Mega2560 20 (SDA), 21 (SCL)
// Leonardo 2 (SDA), 3 (SCL)
// Due 20 (SDA), 21 (SCL), SDA1, SCL1
//Teensy 3.0/3.1 18 (SDA), 19 (SCL),Back Side 30 (SDA1), 29 (SCL1)
#include <Wire.h>
#define I2C_ADDR 0x3c // Define I2C Address, 0x3c or 0x3d
#include <OLedI2C.h>
OLedI2C LCD;
// custom font arrays
byte newChar1[8] = {
B11011,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B10101
};
byte newChar2[8] = {
B10000,
B01000,
B00101,
B00100,
B00100,
B00101,
B01000,
B10000
};
byte newChar3[8] = {
B10001,
B01010,
B01110,
B00100,
B00100,
B01110,
B01010,
B10001
};
byte newChar4[8] = {
B11111,
B11111,
B11111,
B00100,
B00100,
B11111,
B11111,
B11111
};
byte newChar5[8] = { // 5TH custom font
B10101,
B10000,
B10110,
B00001,
B00000,
B10001,
B01010,
B00000
};
void setup() {
Wire.begin(); // Start Wire Library
LCD.init(I2C_ADDR); // initialize the lcd with I2C Address
//delay(1000);
// Store custom font data in 420CW Oled
LCD.createChar(0, newChar1);
LCD.createChar(1, newChar2);
LCD.createChar(2, newChar3);
LCD.createChar(3, newChar4);
LCD.createChar(4, newChar5);
LCD.createChar(5, newChar5);
LCD.createChar(6, newChar5);
LCD.createChar(7, newChar5);
LCD.sendString("SETUP ()", 0, 0); //("String", col, row)
delay(1000);
}
void loop() {
//////////// set Contrast test 1 ////////////////
LCD.sendString("set Contrast test DW", 0, 0); //("String", col, row)
for (int Contrast = 255; Contrast > 0; Contrast = Contrast-- / 2 ) {
LCD.setContrast(Contrast); // Set Contrast (Minimum allowed 0) 0~255
LCD.setCursor(9, 1); //(col,row)
LCD.print(Contrast);
LCD.print(" "); //clear
delay(300); //delay not necessary as its sending a lot of Commands wich has delay inside the lib.
}
delay(2000); // 2sec. delay
LCD.clearLcd();
LCD.sendString("set Contrast test UP", 0, 0); //("String", col, row)
for (int Contrast = 0; Contrast < 510; Contrast = Contrast++ * 2 ) {
LCD.setContrast(Contrast); // Set Contrast (Minimum allowed 0) 0~255
LCD.cursPos(9, 1); //(col,row)
LCD.print(Contrast);
LCD.print(" "); //clear
delay(300); //delay not necessary as its sending a lot of Commands wich has delay inside the lib.
}
delay(2000); // 2sec. delay
LCD.clearLcd();
// Double Height(4-line) Test
LCD.sendString("Double Height(4x20)", 0, 0);
LCD.sendString("Test", 8, 1);
delay(2000); // 2sec. delay
LCD.setDoubleH(1);
LCD.sendString("MODE 1", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(2);
LCD.sendString("MODE 2", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(3);
LCD.sendString("MODE 3", 0, 1);
delay(1000); // 1sec. delay
LCD.sendString(" ", 0, 1); // clear MODE 3 from Oled
LCD.setDoubleH(4);
LCD.sendString("MODE 4", 0, 2);
delay(1000); // 1sec. delay
LCD.setDoubleH(0); //back to 4x20
LCD.sendString("MODE 0 (4-line)", 0, 2);
delay(3000); // 3sec. delay
LCD.clearLcd();
//////////// Print custom font Using Wire.h Library test 2 ////////////////
LCD.setDoubleH(3); // MODE 1
LCD.sendString("Print custom font / Wire Library", 0, 0); //("String", col, row)
LCD.sendString("custom font -->", 0, 3);
delay(3000); // 1sec. delay
LCD.setDoubleH(0);
delay(1000); // 1sec. delay
LCD.cursPos(16, 3); //(col,row) / set up position
// Test / Print custom font 5 using Wire.h Library
Wire.beginTransmission(I2C_ADDR); // start condition + Define I2C Address where the US2066 is, and set R/W# bit to logic “0” write mode.
// Print custom font
Wire.write(B01000000); // control byte or the data byte, Co and D/C# bits following by six “0”’s.
//Wire.write(B00000011); //DEC 3 // print custom font 4 [8bit (hi bit 0000/low bit 0011
Wire.write(4); //DEC 4 / 5th custom font (Zero based array indexing.....)
Wire.endTransmission(); // stop condition / 7) The write mode will be finished when a stop condition is applied.
delay(3000); // 3sec. delay
LCD.clearLcd();
delay(1000); //1sec. delay
//////////// Print 2 custom font Using LCD.sendData test 3 ////////////////
LCD.sendString(" Print two custom fonts / LCD.sendData", 0, 0); //("String", col, row)
LCD.cursPos(2, 2); //(col,row)
LCD.print("---> ");
delay(1000); // 1sec. delay
LCD.sendData(0); //Print custom font 1 (Zero based array indexing.....)
LCD.print(" <---> ");
delay(1000); // 1sec. delay
LCD.sendData(char(1)); //Print custom font 2
delay(3000); // 3sec. delay
LCD.clearLcd();
delay(1000);
//LCD.scrollString("test", 2, 100);
//////////// command test ////////////////
/*
sendCommand(0x2A);//function set (extended command set)
sendCommand(0x71); //function selection A
sendData(0x00); //disable internal VDD regulator (2.8V I/O). data(0x5C) = enable regulator (5V I/O)
sendCommand(0x28); //function set (fundamental sendCommand set)
sendCommand(0x08); //display off, cursor off, blink off
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xD5); //set display clock divide ratio/oscillator frequency
sendCommand(0x70); //set display clock divide ratio/oscillator frequency
sendCommand(0x78); //OLED command set disabled
sendCommand(0x09); //extended function set (4-lines) / last bit=1 : 3-line or 4-line display mode
sendCommand(0x06); //COM SEG direction
sendCommand(0x72); //function selection B
sendData(B00000000); //ROM CGRAM selection
sendCommand(0x2A); //function set (extended command set)
sendCommand(0x79); //OLED command set enabled
sendCommand(0xDA); //set SEG pins hardware configuration
sendCommand(0x10); //set SEG pins hardware configuration
sendCommand(0xDC); //function selection C
sendCommand(0x00); //function selection C
sendCommand(0x81); //set contrast control
sendCommand(0x7F); //set contrast control
sendCommand(0xD9); //set phase length
sendCommand(0xF1); //set phase length
sendCommand(0xDB); //set VCOMH deselect level
sendCommand(0x40); //set VCOMH deselect level
sendCommand(0x78); //OLED command set disabled
sendCommand(0x28); //function set (fundamental command set)
sendCommand(0x01); //clear display
sendCommand(0x80); //set DDRAM address to 0x00
sendCommand(0x0C); //display ON
delay(150);
sendCommand(0x0C); // **** Turn on Display
delay(150);*/
}0 -
Hi Chris,
Thank you very much for staying with me on this. It is greatly appreciated. Looking at the "Library in the wrong location" first.
While yes, it could be, but this is the results of this line of inquiry here.
1. I have three library locations (don't know why?), they are:
a) /home/mprowe/Arduino/libraries/
b) /home/mprowe/.arduino15/packages/arduino/hardware/avr/1.6.18/libraries/
c) /opt/arduino-1.8.0/libraries/
2. For testing purposes only, I have put your library in all three locations - with a customized library.properties file.
3. The log output (below) shows that it has found all three & is using the copy at (2.b) see lines 86 to 89. This is alongside the wire library.74 Linking everything together...
75 "/home/mprowe/.arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/avr-gcc" [.... truncated by me]
76 /tmp/ccVbwl16.ltrans0.ltrans.o: In function `__static_initialization_and_destruction_0':
77 /home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:16: undefined reference to `OLedI2C::OLedI2C()'
78 /tmp/ccVbwl16.ltrans0.ltrans.o: In function `setup':
79 /home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:24: undefined reference to `OLedI2C::init(unsigned char)'
80 /tmp/ccVbwl16.ltrans0.ltrans.o: In function `loop':
81 /home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:29: undefined reference to `OLedI2C::sendString(char const*, unsigned char, unsigned char)'
82 /home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:30: undefined reference to `OLedI2C::sendFloat(float, unsigned char, unsigned char, unsigned char, unsigned char)'
83 /tmp/ccVbwl16.ltrans0.ltrans.o: In function `_GLOBAL__sub_D_LCD':
84 /home/mprowe/Arduino/nhd-i2c/oled-example/oled-example.ino:16: undefined reference to `OLedI2C::~OLedI2C()'
85 collect2: error: ld returned 1 exit status
86 Multiple libraries were found for "OLedI2C.h"
87 Used: /home/mprowe/.arduino15/packages/arduino/hardware/avr/1.6.18/libraries/OLedI2C
88 Not used: /home/mprowe/Arduino/libraries/OLedI2C.home
89 Not used: /opt/arduino-1.8.0/libraries/OLedI2C.opt
90 Using library Wire at version 1.0 in folder: /home/mprowe/.arduino15/packages/arduino/hardware/avr/1.6.18/libraries/Wire
91 Using library OLedI2C at version 1.0 in folder: /home/mprowe/.arduino15/packages/arduino/hardware/avr/1.6.18/libraries/OLedI2C
92 exit status 1
93 Error compiling for board Arduino/Genuino Uno.4. Compiling with only one copy of the OLedI2C in each location. First run with OLedI2C in 2.a), second run with OLedI2C in 2.b) and finaly with OLedI2C in location 2.c) still results in a compilation error?
5. I have placed a full copy of the compilation log ftp://mpr75@talktalk.net@www.mpr75.talktalk.net/oled-example.log. This is what I meant in the last over, about sharing the full log file. In many forums you can upload and link these files but I can not find any way to do the same on this site? If you can find the time to have a look at the whole whole log file in the hope that any other clues should "jump out"?
Best regards, Martin0 -
Hi Chris,
Short note to bring you up to date with my latest testing.
I have installed the Windows Aurduino IDE (1.8.3) https://www.arduino.cc/download_handler.php?f=/arduino-1.8.3-windows.exe in an attempt to replicate your success. Unfortunately, your example will still will not compile using the OLedI2C library. The error log is almost exactly the same as I get on my Linux machine.
Secondly, to try and avoid any OS dependency’s, I have done the same using the official web based workbench, Arduino Create. Yet again, no compilation success!! I have posted the verbose error log here http://www.mpr75.talktalk.net/. At my (low-level) of understanding all three logs seem similar. To me, it is suggesting a path-resolution problem in OLedI2C.ccp or its dependencies?
I am guessing that your Windows machine has had a personal environment variable setup that is allowing you to compile?
Regards, Martin0
Please sign in to leave a comment.
Comments
9 comments