Nano every 4808 и i2c lcd

Доброго времени суток, не хотел сюда писать, но оказался в тупике. Собрал прототип на базе обычной нано, все работало почти, но не хватало памяти для всех задач, заказал из Китая 4808 every и тут понеслась. Оказалось, что не поддерживается библиотека Wire.h, ввиду чего экран 2004а не могу подключить по i2c с помощью библиотеки LiquidCrystal_i2c. Не подскажете - есть ли какая-нибудь библиотека для данных целей?

В аддоне для 4808 долна быть совместимая библиотека WIRE.h
Какой аддон вы используете?

Thinary Nano Every. В ИДЕ подключал по ссылке просто

не может такого быть просто

Ожидаемо там есть Wire.h
ThinaryArduino/Thinary-megaavr/libraries/Wire/src at master · Thinary/ThinaryArduino · GitHub
Есть и встроенные примеры для whire
Я сам этот аддон не пробовал.
Какой текст вашей ошибки?

Ошибки нет, точнее при компиляции ее нет, но при старте зависает на инициаллизации дисплея, как я понял, как раз из-за wire, так как до этого зависал на wire rtc, но его удалось подключить подругому.``` // put your setup code here, to run once:

delay(300);
Serial.begin(9600);
Serial1.begin(19200);
delay(300);
Serial1.println(“Blink1”);
Serial1.println(“starting wire”);
time.begin(&sWire);
Serial1.println(“Wire ok”);
pinMode(relay1pin, OUTPUT);
pinMode(relay2pin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(setButtonPin, INPUT);
pinMode(upButtonPin, INPUT);
pinMode(downButtonPin, INPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
Serial1.println(“pins configured ok”);

initStartVariables();
Serial1.println(“inited start vars”);
lcd.init();
lcd.backlight();
Serial1.println(“inited lcd”);
// подсветка активация
printOnDisplay(“Hello”, 0, 0, true);
Serial1.println(“Hello”);
initReleaySettings();
initRotorsSettings();
readTemperature();
Serial1.println(“inited relays and rotors”);
delay(30000); ```
В порт не выводит inited lcd. Соответсвенно и висит. Попробовал другую LiquidCrystal подключить - выкинуло кучу ошибок libraries/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp.o (symbol from plugin): In function LiquidCrystal_I2C::LiquidCrystal_I2C(unsigned char, unsigned char, unsigned char)': (.text+0x0): multiple definition of LiquidCrystal_I2C::init()’
sketch/LiquidCrystal_I2C.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit statu
Но тут-то ладно

У меня нет такой платы, так что помочь не смогу.
Могу порекомендовать. Если проблемма с дисплеем, то разбираться надо с дисплеем. В коде ничего другого быть не должно. Максимум - сериал для связи с ПК.

Попробовал из репозитория в папку закинуть и подключить как файл. Совсем дичь началась:

   <title>ThinaryArduino/Thinary-megaavr/libraries/Wire/src/Wire.cpp at master · Thinary/ThinaryArduino · GitHub</title>
                                                                               ^
/home/dragomir/Arduino/Dorri2/Wire.cpp:112:80: error: stray '\267' in program
   <title>ThinaryArduino/Thinary-megaavr/libraries/Wire/src/Wire.cpp at master · Thinary/ThinaryArduino · GitHub</title>
                                                                              ```

Итого Wire из репа выдает кучу ошибок сразу, ссылается на TwoWire и прочее, не знаю почему пока. При отключении Wire.h библиотеки все стартует нормально, но зависает на моменте инициаллизации lcd в setup. Попробую покопать lyquidcrystal

Просто для информации - если вы хотите, чтобы вам помогли - выкладывайте код полностью и по правилам, а не так как в #6

1 лайк

И снова я вернулся к этому вопросу. Выкладываю общий код, где нарушается работоспособность

#include <Wire.h>



#include <iarduino_I2C_Software.h>
#include "iarduino_RTC.h"
SoftTwoWire sWire(4,5);
iarduino_RTC time(RTC_DS1307);
//#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

#include <EEPROM.h>
#include <stdlib.h>

//!#include <Wire.h>
//!#include "wire_t/Wire.h"
//!#include <LiquidCrystal_I2C.h>


#include "LiquidCrystal_I2C.h"

#include "GyverOS.h"
#include <DS_raw.h>
#include <microDS18B20.h>
#include <microOneWire.h>

LiquidCrystal_I2C lcd(0x27,20,4);

GyverOS<5> OS;
MicroDS18B20<18> sensor;

boolean firstStart;

const int setButtonPin = 14; 
const int upButtonPin = 15; 
const int downButtonPin = 16; 

const int relay1pin = 17;
const int relay2pin = 12;
const int ledPin = 13;

const int screenSize = 8;

//rotors

int IN3 = 11; // Input3 подключен к выводу 5
int IN4 = 10;
int IN1 = 9; // Input3 подключен к выводу 5
int IN2 = 19;
byte rotateDurability[] = {0, 0};

//7,8 sensors (D7 & D8 phis)

enum Screen{
  STATUS = 0,
  WATCH = 1,
  TIMER = 2,
  THERMO = 3,
  RELAY1 = 4,
  RELAY2 = 5,
  ROTOR1 = 6,
  ROTOR2 = 7,
  WIFI = 8,
  WIFI_PASS = 9
} screen;

enum RelayMode{
  TEMP = 0,
  TIME = 1
} relayMode;

boolean settingMode = false;

  int currentScreen = 0;
  Screen curerntScreenEnum = STATUS;
  boolean screenChanged = false;

  boolean setButtonPressed = false;
  boolean upButtonPressed = false;
  boolean downButtonPressed = false;


uint32_t btnTimer1 = 0;
uint32_t btnTimer2 = 0;
uint32_t btnTimer3 = 0;

int currentSetIndex = 0;
int setLenth[5] = {0, 3, 6, 12, 15};
String currentDateTime = "";
boolean wasEdited = false;

String temp;

byte relayModes[] = {0, 0};
byte relayStatus[] {0, 0};
boolean endTimer = false;
String timerTitle;
String tempTitle;
boolean isFromOtherScreen = false;
int screenRequested = 0;
boolean needEndSetting = false;

int currentRelay;
String relay1timer = "00:00";
String relay2timer = "00:00";
String relay1timerEnd = "00:00";
String relay2timerEnd = "00:00";
String relay1temp = "49";
String relay2temp = "49";

String currentTempSet;
 boolean changed;

 int currentRotor;
 String rotor1timer = "00:00";
 String rotor2timer = "00:00";
boolean rotateChange = false;
char durationRotor[11] = {' ', ' ', ' ', ' ', ' ',' ', ' ', ' ', ' ', ' ', 0};
boolean isRotor = false;


String serialNumber = "tstaadev0001";

//WI-FI
char ssid[20];
char wifiPassword[20];
char chars[37] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0};
boolean wifichanged = false;
int currentCharSelected = 0;
int currentPosition = 0;

//EEPROM
struct eepromAddresses {
  int firstStart = 0;
  //relay
    //mode
  int relayMode[2] = {1, 2};
  //status
  int relayStatus[2] = {5, 6};
  //timer
  //start
  int relayStartTime[2] = {10, 20};
  //end
  int relayEndTime[2] = {30, 40};
  //temp
  int relayTemp[2] = {50, 60};

  //rotor
  int rotorDur[2] = {3, 4};
  //timer
  int rotorTime[2] = {70, 80};
  //wifi
  int wifiSsid = 90;
  int wifiPass = 110;
};

eepromAddresses addresses;

void setup() {
  // put your setup code here, to run once:
  
  delay(300);
  Serial.begin(9600);
    Serial1.begin(19200);
        delay(300);
    Serial1.println("Blink1");
    Serial1.println("starting wire");
  time.begin(&sWire);
Serial1.println("Wire ok");
  pinMode(relay1pin, OUTPUT);     
  pinMode(relay2pin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(setButtonPin, INPUT); 
  pinMode(upButtonPin, INPUT);
  pinMode(downButtonPin, INPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
  pinMode (IN1, OUTPUT);
  pinMode (IN2, OUTPUT);
  Serial1.println("pins configured ok");
  Serial1.println("current time: " + String(time.gettime("d-m-Y, H:i:s, D")));
  time.settime(0,51,21,27,10,15,2);
  Serial1.println("current time: " + String(time.gettime("d-m-Y, H:i:s, D")));

  initStartVariables();
  Serial1.println("inited start vars");
  lcd.init();                                         
  lcd.backlight();    
  Serial1.println("inited lcd");
  // подсветка активация
  printOnDisplay("Hello Dorri! v0.1", 0, 0, true);
  printOnDisplay("S/N:" + serialNumber, 0, 1, false);
   Serial1.println("Hello Dorri! v0.1");
  initReleaySettings();
  initRotorsSettings();
  readTemperature();
   Serial1.println("inited relays and rotors");
  delay(30000);
  
  OS.attach(0,requestButtons, 0);
  OS.attach(1,changeScreen, 100);
  OS.attach(2,drawScreen, 100);
  OS.attach(3, readTemperature, 1000);
  OS.attach(4, trigger, 60000);
  Serial1.println("os configured");
  curerntScreenEnum = 0;
  screenChanged = true;
 Serial1.println("Setuped");
}

Используется WIRE мегааврный, но фактически часы тоже не сетят время, то есть не работают, хотя и под другой библиотекой. Сейчас зависает код на строке lcd,init.
Я уже совсем не понимаю из-за чего так происходит. Альтернативной библиотеки для 2004а не нашел. Часы то, по сути, могу запустить и черз другую библиотеку

распиновку для 4808 брал с https://wolles-elektronikkiste.de/en/arduino-nano-every-a-deep-dive#pinout не проверял. А вот на самой плате распиновка нарисована другая, как на атмеге

Покажите фото вашей платы и ссылку на продавца, у которого вы ее покупали

А вот сфоткать в фокусе не могу из-за гребаного телефона

Там какой-то бред. У этого аддона, судя по исходнику, шина I2c сконфигурирована на пины PD4 & PD5, которые не выведены наружу на вашей плате.
Вместо этого на плате шина выведена на PF2 & PF3.

Если я увидел правильно, библиотеку Wire из аддона надо переписывать.

Не помню, я вроде задавал вопрос - нафига вам Евери? Это мертворожденный зверь, от него и в Ардуино-то уже практически отказались.

Мне на нанке не хватило памяти, и, как мне показалось, евери решит как раз эту проблему

Попробуйте другой аддон для своей платы

Он соответвует распиновке, что вы привели в сообщении 12

Да вот прозвонил - да, PF2, PF3, на плате на самой они и помечены как SDL SCL.

а в библиотеке - PD4 & PD5, потому и не работает нифига

Попробовал другой аддон - теперь загружается до работоспособности, но по i2c данных нет, точнее на дисплей ничего не идет, на часы время не устанавливается, приходит 0