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
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);
}
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.
Das ist doch schon mein Lieblingsarduino.
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
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.
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.
Muss wohl erst in Text konvertiert werden..
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);
}
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.