I2C OLED will not turn on or display - arduino

I have started using the Arduino language instead of the pyFirmata version. I am using an Arduino UNO. I have run into the same problem, and that is that the OLED won't work. I've tried 2 different OLEDs, one from UCTRONICS and one from HiLetGo. They are both I2C 128x64 OLEDs, and the UCTRONICS one is yellow and blue while the HiLetGo one is all white. I've tried 2 different codes, one that I made and one example from the ssd1306 library. There are no errors, the OLEDs just don't light up. The board is alco connected to 4 touch sensors I am using for the same project but they have nothing wrong with them (yet). I have troubleshooted for a while now, and I have been able to pinpoint where the error is (probably) located. This is my code: (even though the ssd1306 I2C 128x64 example also doesn't work.) I also do not want suggestions that require extra hardware that I don't have, like an RTC (even though it is not related to this that was the only example I could come up with) This is my code: (even though the ssd1306 I2C 128x64 example also doesn't work.)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
#define sw 128
#define sh 64
Adafruit_SSD1306 display(sw, sh, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x78);
display.cp437(true);
pinMode(A4, OUTPUT);
}
void loop() {
digitalWrite(A4, HIGH);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("test");
Serial.println("test");
digitalWrite(A4, LOW);
}
Like always, I only have 1 week to fix this so help would be greatly appreciated.

Your I2C address setting appears wrong. Arduino's Wire library (doc) uses 7 bit address. The last bit is read/write bit and Wire automatically takes care of it. So, you want to chop off the least significant bit and set the address to 0x3C instead of 0x78.
Adafruit_SSD1306 library actually uses 0x3C as a default address. See the declaration and notes for begin() in .h and .cpp files.
For more info, I suggest looking at SSD1306 data sheet. Here is the I2C data format. See how slave address is formatted.

Yes, these displays can be very annoying. I have experienced it myself.
First, go to the website of the supplier and see if they suggest any specific libraries to use. Some of the main issues I encountered are:
The supply voltage of the screen is not the standard 5V you expected but higher or lower. If it's lower or you supplied 5V to a 3.3V power in you might even have damaged or broke the display.
You switched the SDA/SDL wires up, forgot to connect some wires or have a faulty ground. Does the backlight work?
The library uses the wrong clockspeed
The I2C address the display is listening on differs from the one used in the library (this is the most common one for me)

It's not every time the fault of hardware, check the program as well. Load example test program and try again. https://iotforgeeks.com/i2c-oled-display-not-working/ helped me to resolve the same issue.

Related

STM32 Blue pill and Arduino IDE

I want to program Stm32 bluepill with Arduino IDE but when I want to define pins like I write " pinMode(A10, OUTPUT)" it gives error. the error is "'A10' was not declared in this scope"
I want to know how should I declare Pins in Arduino IDE for STM32
Based on the error you're reporting, you're not building your code for the correct board. I suspect you're targeting the ArduinoUNO (default) which does not have an A10.
Also, as hcheung's answer mentions, the name on the blue pill is "PA10".
Follow the instructions here to install the board configuration for the STM "blue pill" then select it and build again.
https://maker.pro/arduino/tutorial/how-to-program-the-stm32-blue-pill-with-arduino-ide
Note, the board selection as of today is now "STM32F1 series" instead of "STM32F103C series" as specified at the link.
One reason could be there is not ADC pin of number 10 for the currently selected board (check the board on tool -> boards), there might be fewer number of ADC pins, e.g. try A0.
Or maybe you have selected wrong board. Bluepill isn't included in the Arduino IDE, by default. So you have to add it to your IDE first.
There is a nice instruction here on how to do this and a sample code.
https://maker.pro/arduino/tutorial/how-to-program-the-stm32-blue-pill-with-arduino-ide
Remember that this newly installed library could have small differences in syntax compared with standard Arduino code, Like this example that is taken from the mentioned site:
void setup() {
// change pin PC13
pinMode(PC13, OUTPUT);
}
//infinite loop
void loop() {
digitalWrite(PC13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(PC13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
As you can see here the pin is selected using "PC13", and not just a number aka "13".
So in this case by installing the library used in the mentioned site you should write PA0 to PA7 for using ADC.
Here is a sample picture displaying the name of the pins and their features:
For STM32 Blue Pill with Arduino Core, digital pins are named based on its port and pin number, such as PB1, PA10.
There is no A10, I assumed that you mean PA10 (which was marked on the Blue Pill PCB as "A10" (for Port A Pin 10) due to limit space on the PCB.
To use it as a digital pin, simply use PA10 to address it, that is:
pinMode(PA10, OUTPUT);
or because PA10 internally happened to be referred as D10, you can also use:
pinMode(10, OUTPUT); //not recommended
For better understanding of all the pin assignments for STM32F103 Blue Pill, please take a look at the source code here and here.

Interfacing MCP4651-502E digital potentiometer using I2C

I am using two MCP4651 dual digital potentiometers, which I want to control from Arduino Uno thru I2C. Here's datasheet for MCP4651, so you don't have to look for it: http://www.farnell.com/datasheets/1789212.pdf
I would also attach PCB schematic, but I don't have enough reputation.
I am trying to write my value into the wiper 1 register like on page 49 of datasheet. But every command I try, I get not acknowledged. I also attached screenshot of the oscilloscope.
Here's my code:
#include <Wire.h>
void setup()
{
Wire.begin();
}
void loop()
{
Wire.beginTransmission(40);
Wire.write(0b10010000);
Wire.write(0b10000000);
Wire.endTransmission(40);
delayMicroseconds(500);
}
The I2C protocol clearly works, or I would not get acknowledged address and I tried both potentiometers, both wipers, writing, incrementing and decrementing. Not a single success. If anyone knows what am I doing wrong, I would be grateful.
Page 49 of the datasheet details the general call details.
The general call commands are detailed on page 48. These commands are used when you are using the general call address (0) to communicate with all the devices at the same time.
You are trying to communicate with a single device on the bus, so you should pay attention to the commands detailed starting at page 51 and in particular Table 7-1, 7-2 and Figure 7-1.

Getting text to show up on an I2C LCD

I am new to electronics, and trying to get my 1602 LCD to work with an I2C adapter.
I got my backlight to work, but I can't get text to show.
This is my current code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(5, 0);
lcd.print("HELLO");
}
void loop() {
lcd.backlight();
delay(2000);
lcd.noBacklight();
delay(2000);
}
I checked for the I2C address with the scanner and it is 0x27.
I Googled a bit and came past this post where someone posted this:
Simple test
Apply +5v / GND to LCD - display - and than apply background LED power ( sometime marked A/K) to the LCD module.
No other connections ( data etc.) are necessary for this power up test.
You should be able to discern ALL chatterers fields, but connecting contrast pot will make it easier.
It MAY not be totally visible but the module will initialize ( internally) on power up and ALL characters fields should show.
Of course by now you know you need basically three "power" connections to the LCD - LCD itself, contrast and backlight.
Sure looks as the main LCD power is missing - hence no intelligent data can be processed / displayed.
I did this test aswell and came to these results:
When providing 5V to the backlight, it shows up bright.
When providing 5V to both the backlight and the LCD itself the backlight gets darker but nothing else shows up.
I then accidentally put the I2C adapter upside down, but that did give me the text blocks.
How could I get the text to show? What am I currently doing wrong?
Minor point, have you tried trimming the pot? I suspect that this sets the contrast, and I forgot this and I had a blank display.
Yours Simon M.
Your I2C Adapter turns serial data into parallel output to the LCD pins.
Are you sure this is done to the pins you expect ?
Especially if you mix any I2C adapter to any 16 pin LCD module, you should check which signals you put where ...
If required, there are LiquidCrystal_I2C constructors where you can specify the LCD pins, if the default won't fit.

How to control a motor with two inputs using arduino

I am using an arduino uno and I am trying to control a motor with two inputs which I found in a small car I used to have as a child.
I connected the first pin of the motor to the arduino ground and the second one to the VCC and the motor started turning.
However, when I write the following code the motor doesn't work.
void setup() {
pinMode(8,OUTPUT);
digitalWrite(8,HIGH);
}
void loop() {
}
(I have connected the first pin of the motor to the ground and the second one to pin 8 of arduino).
Does anybody know why that happens?
You can only get a certain amount of current from an Arduino output pin. In general, you can light an LED with a direct connection to an output pin, but motors require more current. A detailed discussion is here.
To control a device such as a motor which needs more current than the output pin can provide directly, you can use an external transistor. You can buy circuits that implement this idea, such as this Motor Shield for Arduino.
This is not how Arduino is supposed to work with power consuming stuff (like mhopeng said, you may use LED in such a scheme, but not something more consuming): a motor should be between GND and 5V and if you want to control it, you have to use a transistor connected to an output pin.
I had a similar question once, it may be of help, too. Also, it may be a good idea to ask further questions at arduino.SE.

Arduino 16x2 LCD Stays Blank

I am using an Arduino Mega with a 16x2 LCD. When I start the Arduino the LCD flashes white and sometimes random lines will show up and gradually fade out. The backlight is on, however, so the LCD is not inverted. At first I thought the Arduino was not getting enough power because I am using a Raspberry Pi to program it, but plugging in a 6V battery pack did not change the result. I tried plugging in a different 16x2 LCD to check if the one I was using is broken, but again, the result was the same. I have triple-checked my connections, adjusted the potentiometer, and fiddled around with where the LCD was connected on the breadboard in case some of the pins were broken, but to no avail.
Does the LCD have a problem with Arduino Mega boards? Or am I just unfortunate enough to have two broken LCDs?
Code:
#include <LiquidCrystal.h>
#define led_pin 22
#define buzzer_pin 7
LiquidCrystal lcd(12,11,5,4,3,2);
void setup() {
pinMode(led_pin, OUTPUT);
pinMode(buzzer_pin, OUTPUT);
lcd.begin(16,2);
digitalWrite(led_pin, HIGH);
tone(buzzer_pin, 1000, 500);
delay(500);
digitalWrite(led_pin, LOW);
lcd.print("LCD Test");
}
void loop() {
}
EDIT
I moved the LCD and wiring back to the other side of the breadboard and it did not change the output. I'm starting the think that the LCDs are just simply broken because the LCDs will randomly flash and fade unevenly. I found that these LCDs can be easily fried by incorrectly adjusting the potentiometer.
Make sure that you solder headers to the lcd, then press the headers into your breadboard and connect to arduino with jumper wires. Just resting the LCD on the headers without solder or jabbing the lcd pin holes with jumper wires don't make reliable connections. You WILL see random stuff
Make sure you connect the LCD correctly. If you did, you wouldn't have got any problems. Post a picture.
Make sure the pins you used in the code match pins you connected to the LCD.
Best way to get arduino help is on arduino forum.
Specifically which LCD are you using?
Do you have datasheets for the exact LCD you are using so you can confirm you have the correct wiring and supply voltages?
If you still have no luck, you may want to try a LCD module that has a serial, i2c, or spi interface.
They are much easier to use than HD44780 parallel modules (im assuming this is what you have).
An example source of such modules is https://www.crystalfontz.com/c/character-lcd-displays/interface/24

Resources