Keine Ausgabe auf Oled mit SoftI2CMaster

Weil mir hin und wieder die Analogpins ausgehen, versuche ich gerade erfolglos SDA und SCL auf die Pins 11 und 12 zu verlegen.
Ich verwende dazu erst mal einen einfachen Sketch, mit welchem ich mir die Werte anzeigen lasse die der AD Wandler von einer anliegenden Spannung generiert.
Mit Wire.h (und natürlich auf A4 und A5 gesteckten Kabeln) funktioniert der Sketch und ich bekomme die "AD Werte" auf dem Oled angezeigt.
So bald ich auf SoftI2CMaster.h "umbaue" bekomme ich jedoch keine Ausgabe auf dem Oled, - der Serielle Monitor zeigt aber die erwarteten Werte.

Hat jemand von Euch einen Tip ?
Leider habe ich nirgends ein Beispiel gefunden welches einfach nur eine Displayausgabe über "verschobene Pins" realisiert, wenn Ihr eines kennt : Bitte her mit dem Link :wink:
Ich vermute ja, dass die Adafruit Libs für das Display nicht mit SoftI2CMaster wollen...

Wahrscheinlich hab ich aber nur wieder mal einen Klops eingebaut, - deshalb hier der Sketch:

#define SDA_PIN 3
#define SDA_PORT PORTB        //legt SDA auf Pin 11
#define SCL_PIN 4
#define SCL_PORT PORTB        //legt SCL auf Pin 12
#define I2C_FASTMODE 1
//#define I2C_SLOWMODE 1
#define I2C_HARDWARE 0

#include <SoftI2CMaster.h>


#include <SPI.h>
//#include <Wire.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3c ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


const byte inputPin1 = A1;    // der Pin an dem eine Spannung anliegt


unsigned long sensorValue1 = 0;  // variable in welcher der aus vom Sensor gelesene Wert gespeichert wird


void setup() {

  Serial.begin(115200);
  Serial.println(F("START " __FILE__ " from " __DATE__));

  if (!i2c_init()) {
    Serial.println("I2C init failed");
  }


  //  i2c_init();
  delay(1000);


  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);  //define I2C Adress

  display.display();
  display.clearDisplay();


}


void loop() {
  sensorValue1 = 0;

  int i = 0;
  for (i = 0; i < 50; i++) {
    sensorValue1 += analogRead(inputPin1);
  }

  sensorValue1 = sensorValue1 / i;

  Serial.println(sensorValue1);

  i2c_start(0x3c);
  i2c_write(sensorValue1);



  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(WHITE);

  display.setCursor(0, 2);
  display.print(sensorValue1);
  display.display();

  i2c_stop();


//  delay(1000);
}

Dann solltest du dem Sketch auch mitteilen, dass du Pin 11 und 12 verwenden möchtest.

Allerding, bevor ich SoftI2C verwende , baue ich lieber einen zusätzlichen analog zu digital Decoder ein. Z.B der ADS1115.

Mache ich das nicht mit

#define SDA_PIN 3
#define SDA_PORT PORTB        //legt SDA auf Pin 11
#define SCL_PIN 4
#define SCL_PORT PORTB        //legt SCL auf Pin 12

?

A llerding, bevor ich SoftI2C verwende , baue ich lieber einen zusätzlichen analog zu digital Decoder ein. Z.B der ADS1115

Weshalb? ist das so schlecht ?
Ich brauche da normalerweise weder eine hohe Genauigkeit noch hohe Geschwindigkeit, dafür habe ich meistens wenig Platz.

.

NEIN
PortB sagt nicht über den Pin aus, nur über den verwendeten Port.
Die Pins stehen darüber und sind doch auch eindeutig als Pin bezeichnet, oder ?

Das ist nur gut, wenn es auch funktioniert.
Und ich habe bisher damit keine guten Erfahrungen gemacht. Aber ist schon lange her und für mich kein Thema mehr.

wenns nur um zwei Analoge pins geht, würde ich einfach einen Arduino Nano nehmen, der hat zwei mehr.

Und kleiner als ein Uno is ein Nano sowieso.

Das ist doch schon mein Lieblingsarduino. :slight_smile:
Bei letzten Projekt hat mir trotzdem exakt 1 pin gefehlt... Das ließ sich jetzt erst mal mit einem LGT8F328P "Nano Style" Board lösen, bei dem lässt sich AREF (nach anpassen der "pins.h") als A10 nutzen.

@HotSystems
hier die Beschreibung aus der SoftI2CMaster.h :

/* In order to use the library, you need to define SDA_PIN, SCL_PIN,

  • SDA_PORT and SCL_PORT before including this file. Have a look at
  • http://www.arduino.cc/en/Reference/PortManipulation for finding out
  • which values to use. For example, if you use digital pin 3 (corresponding
  • to PD3) for SDA and digital pin 13 (corresponding to PB5)
  • for SCL on a standard Arduino,
  • you have to use the following definitions:
  • #define SDA_PIN 3
  • #define SDA_PORT PORTD
  • #define SCL_PIN 5
  • #define SCL_PORT PORTB

Wie ich das verstehe hat jeder Port maximal 8 Pins, am Bord Pin 11 ist intern PortB Pin3, Kurzform PB3.
Ich hatte aber (bevor ich mich etwas eingelesen hatte) auch mal versucht bei Pin 11 bzw 12 hin zu schreiben. Die IDE wirft da bei allem über 7 einen Fehler aus.

Ok, da magst du Recht haben.
So weit bin ich jetzt nicht eingestiegen.
Wie geschrieben, für mich kein Thema.

Leider glückt auch mir die Verbindung dieser Bibliotheken nicht.

Die Bibliothek U8g2 hat eine Ansteuerung an beliebigen Pins schon eingebaut. Getestet mit UNO und SSD1306:

#include <Arduino.h>
#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

void setup(void) {
  u8g2.begin();  
}

void loop(void) {
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(0,24,"Hello World!");
  } while ( u8g2.nextPage() );
  delay(1000);
}

Die Bibliothek braucht etwas Einarbeitung, aber ich finde, es lohnt.

Ich habe gestern noch wo gelesen dass SoftI2CMaster die Displayadresse in 8 Bit will, - hab auch versucht das reinzubasteln, aber nicht hin bekommen. :smirk:

Die Welt kann so einfach sein... probiere ich gleich mal aus ! :smiley:

Edit: Du hast am Anfang des Sketches ein #include Arduino.h , - ist das notwendig oder "nur gewohnheit" ?

Ich habe das Beispiel U8g2\examples\page_buffer\HelloWorld\HelloWorld.ino verwendet, da steht das so drin.

Beim UNO geht es auch ohne, aber es gibt ja soooo viel verschiedene Hardware :slightly_smiling_face:

Das liegt nicht am Uno, sondern an der verwendeten IDE-Version.
Die neueren Versionen binden das automatisch mit ein, da braucht es nicht extra im Sketch aufgeführt werden.

Funktioniert auch mit dem LGT8F328P einwandfrei und braucht weniger Speicher.

Damit habe ich jetzt mit dem "Nano Style" 9 analog in Pins verfügbar...
Danke noch mal !

Jetz muss ich mich nur noch etwas in die Arbeitsweise von U8g2 einlesen, - der Versuch den Inhalt von SensorValue auszugeben sieht irgendwie falsch aus. :laughing:
Muss wohl erst in Text konvertiert werden..

Nein, nutze print.

funktioniert nicht, da bekomme ich eine Fehlermeldung

exit status 1
no matching function for call to 'U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C::print(int, int, int&)'

Das int& heist wohl dass da noch eine Erweiterung dran muss, ich habe aberr noch nicht gefunden welche.
Falls Du einen Tipp hast...

Zeige bitte Dein Programm, das den Fehler verursacht.

Beispiel PrintHelloWorld.ino könnte helfen.

ich bekomme den Fehler auch bei den Beispielsketchen die u8g2.print verwenden...
Bei allen "Hello World" Sketchen die ich bisher gefunden habe ist "Hello World" (mit den Anführungszeichen) direkt in die Ausgabezeile eingefügt, - sieht so aus:

    u8g2.drawStr(0,24,"Hello World!");

I
hier mein Sketch, wenn ich da auf u8g2.drawStr und direkten Text in der Klammer umbaue, dann funktioniert der auch.

#include <Arduino.h>
#include <U8g2lib.h>

const byte inputPin = A10;      // der Pin an dem eine Spannung anliegt

unsigned long sensorValue = 0;  // variable in welcher der aus vom Sensor gelesene Wert gespeichert wird


U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 12, /* data=*/ 11, /* reset=*/ U8X8_PIN_NONE);   // Adafruit Feather M0 Basic Proto + FeatherWing OLED

void setup(void) {
  u8g2.begin();
}

void loop(void) {

  sensorValue = 0;

  int i = 0;
  for (i = 0; i < 50; i++) {
    sensorValue += analogRead(inputPin);
  }

  sensorValue = sensorValue / i;

  int ADCout = sensorValue;

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB12_tr);
    u8g2.print(0, 14, ADCout);
  } while ( u8g2.nextPage() );
  delay(1000);
}


print kann den Cursor nicht plazieren.

  u8g2.setFont(u8g2_font_ncenB12_tr);
  u8g2.firstPage();
  do {
    u8g2.setCursor(0, 14);
    u8g2.print(ADCout);
  } while ( u8g2.nextPage() );

Danke !
Wenn man die Referenz richtig ansehen würde, dann würde man es auch erkennen... :roll_eyes:

Die Bibliothek stellt ein paar praxisorientierte Tricks bereit, die man aber kennen muß, um sie für sich zu nutzen. Bei der falschen Fontwahl ballert man sich schnell den Speicher eines Nanos zu.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.