• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
LCD problem
#1
Witam
 mam problem z LCD, pracuje poprawnie na pinach PB6 i PB7 a potrzebuje na PB10 i PB11, stm32f103.
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x27      //Cambiar si es necesario
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);

void setup() {

  lcd.init ();
  lcd.backlight();
  lcd.setCursor (0, 0);
  lcd.print ("Hola Mundo!");
}

void loop() {

}
 
Odpowiedź
#2
Tu ktoś napisał, że pokazany sposób działa: https://forum.arduino.cc/t/stm32-blue-pi...ary/620360 .
 
Odpowiedź
#3
Widziałem to wcześniej, jakoś mi nie nie wyszedł ten kawałek - " Here is the modified “LiquidCrystal_I2C.cpp” file.",
"I placed inside the sketch folder ".
Ta osoba była na forum ostatnio 10 miesięcy temu.
 
Odpowiedź
#4
W którym miejscu poległeś? Masz ten zmodyfikowany plik (pliki, całą bibliotekę) wrzucić do katalogu szkicu i podać ścieżkę do biblioteki z "" apostrofami. Potem przy kompilacji potwierdź oczami, czy do kompilacji wzięło zmodyfikowany plik, trzeba włączyć wszystkie komunikaty podczas kompilacji (i wgrywania ewentualnie) w ustawieniach programu Arduino IDE.
Druga sprawa, to CORE dla STM, są różne, ja mam ze dwa, ale może być więcej.
W przykładach do danego CORE, po wybraniu płytki maple mini, mam I2c_scanner_wire, jest w nim opcja zakomentowana:
//TwoWire WIRE2 (2,I2C_FAST_MODE);
//#define Wire WIRE2
Użyj tego i znajdź na magistrali adres LCD, potem przełącz sprzęt na drugi I2C, zrób zmiany w szkicu pod drugi I2C i potwierdź, że to działa. Dopiero potem można działać ze zmodyfikowaną biblioteką z nadzieją, że wszystko zagra.
 
Odpowiedź
#5
Po wprowadzeniu zmiany w programie LCD działa tak samo jak do zmian,
Kod:
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include "LiquidCrystal_I2C.h"                 //          zmiana
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {

  lcd.init();
  lcd.backlight();
  lcd.print("Hello, world!");
}

void loop() {
  // put your main code here, to run repeatedly:

}


po dodaniu zmodyfikowanego kodu do foldera 


mam error:
 
Arduino: 1.8.13 (Windows 10), Board: "Generic STM32F1 series, BluePill F103C8, STM32CubeProgrammer (SWD), Enabled (generic 'Serial'), None, Low/Full Speed, Smallest (-Os default), Newlib Nano (default)"
 
WARNING: library LiquidCrystal_I2C-1.1.2 claims to run on avr architecture(s) and may be incompatible with your current board which runs on stm32 architecture(s).
 
LCD_forum_3:5:18: error: 'I2C_FAST_MODE' was not declared in this scope; did you mean 'IS_UART_MODE'?
 
    5 | TwoWire Wire2 (2,I2C_FAST_MODE);
 
      |                  ^~~~~~~~~~~~~
 
      |                  IS_UART_MODE
 
C:\Users\Galinka\Documents\Arduino\LCD_forum_3\modyfied_cpp.ino:7:9: error: redefinition of 'TwoWire Wire2'
 
    7 | TwoWire Wire2 (2,I2C_FAST_MODE);
 
      |         ^~~~~
 
C:\Users\Galinka\Documents\Arduino\LCD_forum_3\LCD_forum_3.ino:5:9: note: 'TwoWire Wire2' previously declared here
 
    5 | TwoWire Wire2 (2,I2C_FAST_MODE);
 
      |         ^~~~~
 
C:\Users\Galinka\Documents\Arduino\LCD_forum_3\modyfied_cpp.ino:7:18: error: 'I2C_FAST_MODE' was not declared in this scope; did you mean 'IS_UART_MODE'?
 
    7 | TwoWire Wire2 (2,I2C_FAST_MODE);
 
      |                  ^~~~~~~~~~~~~
 
      |                  IS_UART_MODE
 
exit status 1
 
'I2C_FAST_MODE' was not declared in this scope; did you mean 'IS_UART_MODE'?
 
 
 
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.


Załączone pliki Miniatury
   
 
Odpowiedź
#6
Ale to co pokazałeś to jakieś żarty, masz dwa x setup i dwa x loop.
 
Odpowiedź
#7
z pojedynczymi to samo
 
Odpowiedź
#8
Pisałeś, że wgrywasz do domyślnego I2C i dziala, sprawdź czy typowe dla Twojej płytki przykłady się kompilują. Wszystko powinno działać OK na tym poziomie (nawet bez wgrywania).
To co pokazujesz na obrazku to nie jest wgrana biblioteka do katalogu projektu. Ikonka sugeruje, że jest plik typu ino, a powinny być dwa, .cpp lub .c i .h lub .hpp, możesz po prostu cały katalog biblioteki skopiować do katalogu projektu i
#include "TenKatalog/LiquidCrystal_I2C.h". Czyli w katalogu projektu mają być trzy pliki, np:
projekt.ino
LiquidCrystal_I2C.h
LiquidCrystal_I2C.cpp
Wyciągnąłem z pudła moją płytkę blupille, ja używam ją jako maple mini i kod wgrywam przez USB STM32duino bootloader , USB poza wgrywaniem robi za dodatkowy port COM.
Obawiam się, że masz inny CORE niż ja, ja mam taki stary/pierwszy wgrywany ręcznie do katalogu hardware w Arduino tam gdzie szkice, musisz przejrzeć przykłady swojego CORE, a nawet głębiej gdzieś w hardware znaleźć bibliotekę wire,  jak jest używana/zdefiniowana druga I2C.
To przykładowy skaner, działa bez problemu u mnie na podstawowych pinach I2C, w komentarzach jest opisane jak należy  przejść na alternatywne piny dla I2C pierwszy lub sprzętowy I2C drugi. Ale u mnie to nie działa, bo biblioteka tego nie ma w sobie. Ale z mojego pliku wire wyczytałem, że trzeba dodać dwie linijki, te które są z komentarzem po polsku. Jak je zakomentujesz to działa na pinach pierwszego I2C, a aktywne przełącza sią na drugie I2C. Sprawdziłem, że wykrywa z tym LCD na I2C drugim.
Kod:
// --------------------------------------
// i2c_scanner
//
// 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 know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// 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
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//



/* Example pinmap for Bluepill I2Cs (by Testato)

I2C-1 standard pins: PB7(sda) PB6(scl)
Use it by "Wire" without pin declaration
  Wire.begin();

I2C-1 alternative pins: PB9(sda) PB8(scl)
Remap the first I2C before call begin()
  Wire.setSDA(PB9);
  Wire.setSCL(PB8);
  Wire.begin();

I2C-2: PB11(sda) PB10(scl)
Remap the second I2C before call begin()
  Wire.setSDA(PB11);
  Wire.setSCL(PB10);
  Wire.begin();

If you want to use the two I2Cs simultaneously, create a new instance for the second I2C
  TwoWire Wire2(PB11,PB10);
  Wire2.begin();

*/


#include <Wire.h>

TwoWire Wire2 (2,I2C_FAST_MODE); //zakomentuj dla I2C pierwszego
#define Wire Wire2 //zakomentuj dla I2C pierwszego

void setup() {

  Serial.begin(115200);
  Wire.begin();
  Serial.println("\nI2C Scanner");
}


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

  Serial.println("Scanning...");

  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) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);

      nDevices++;
    }
    else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found");
  else
    Serial.println("done");

  delay(5000);           // wait 5 seconds for next scan
}
I to samo trzeba dodać do pliku biblioteki. Pewnie bez problemu można to zaszyć głębiej, tak by dodakowym parametrem tworzyć obiekt LCD dla 1 lub drugiego I2C, ale na razie nie umiem. Tak u mnie działa:
Początek pliku .cpp:
Kod:
// Based on the work by DFRobot

#include "LiquidCrystal_I2C.h"
#include <inttypes.h>
#if defined(ARDUINO) && ARDUINO >= 100

#include "Arduino.h"

#define printIIC(args)    Wire.write(args)
inline size_t LiquidCrystal_I2C::write(uint8_t value) {
    send(value, Rs);
    return 1;
}

#else
#include "WProgram.h"

#define printIIC(args)    Wire.send(args)
inline void LiquidCrystal_I2C::write(uint8_t value) {
    send(value, Rs);
}

#endif
#include "Wire.h"
TwoWire Wire2 (2,I2C_FAST_MODE); //zakomentuj dla I2C pierwszego
#define Wire Wire2 //zakomentuj dla I2C pierwszego
Ale te pokazane tu komendy mogą zadziałać z core do STM instalowanym przez managera płytek, nie mam go i nie sprawdzę. Nie byłem zadowolony z bootloadera i go wywaliłem, jak są dwa core to się gryzą.
I szkic z przykładowym Hello world.
Kod:
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include "LiquidCrystal_I2C.h"


LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello, world!");
  lcd.setCursor(2,1);
  lcd.print("Wire2 sie klania!");
   lcd.setCursor(0,2);
  lcd.print("Arduino LCM IIC 2004");
   lcd.setCursor(2,3);
  lcd.print("Power By Ec-yuan!");
}


void loop()
{
}
W sumie to ten scaner jest stary i powinno to działać u mnie, bo kojarzę autora, od niego to pobrałem z githuba, ale może coś potem pozmieniali, nie wiem. Dziala i tak, jak będę potrzebował używać dwóch jednoczesnie to się będę dalej zastanawiał dopiero.
 
Odpowiedź
#9
Skaner znalazł na PB10/PB11 adres 0x27.
cpp z linku " Tu ktoś napisał " nie kompiluje się
 
Odpowiedź
#10
Jeśli zadziałał Ci kod scanera ode mnie, to nie bierz biblioteki z tego linka w #2, ani tamtego rozwiązanania, tylko tą swoją, która już Ci zadziałała na pierwszym I2C, ją skopiuj (dwa pliki .cpp i .h) do katalogu projektu, w nich edytuj .cpp jak pokazałem w #8. A komunikaty z #5 pokazujesz, że nie zrobiłeś jak Ci napisałem, masz tam plik C:\Users\Galinka\Documents\Arduino\LCD_forum_3\modyfied_cpp.ino zamiast swojej biblioteki.
No i jest to typowa biblioteka z managera bibliotek, u mnie w Arduino I2C pokazana jako w ogóle niekompatybilna z STM.
   
Stosowane rozwiązanie musi być zgodne z posiadanym core i używaną biblioteką.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości