ошибка компиляции проекта из нескольких файлов.

alex-dm
Offline
Зарегистрирован: 21.04.2022

Добрый день,

столкнулся, хотя уже и не первый раз, с тем, что если код разбит на несколько файлов - компилит не правильно и не работает.

сливаю все в один  файл - все ок, все работает.

есть идею как все-таки заставить компилить единообразно правильно и то и то?

 

спасибо

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

У меня такой проблемы нет, в любом моем проекте много файлов - это просто для удобства (чтобы не листать простыню "километровую"). А если так, значит именно ты что-то делаешь "не то" или "не так".

Покажи код и как ты его "разбиваешь".

 

alex-dm
Offline
Зарегистрирован: 21.04.2022

Вот код по файлам. в некоторый момент lcd перестает выводить на экран, при этом в сериал все выводится, т.е. код дальше исполняется.

 

//головной

#include "config.h"
#include "sensor.h"
#include "traverse.h"

SensorClass sensLimit1(LIMIT1_PIN);

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

TraverseClass tr(TR_SPR, TR_DIRECTION_PIN, TR_STEP_PIN);

// the setup function runs once when you press reset or power the board
void setup() {
    uint8_t profileName;

    Serial.begin(115200);

    lcd.begin();
    lcd.backlight();
    lcd.print(F("Rewinder apr2022"));
    delay(2000);

    tr.init();
    tr.calibrate();
    Serial.println(F("All done in setup"));
}

// the loop function runs over and over again until power down or reset
void loop() {
  
}

//config.h
#ifndef _CONFIG_h
#define _CONFIG_h

#if defined(ARDUINO) && ARDUINO >= 100
#include "arduino.h"
#else
#include "WProgram.h"
#endif

//sensors
#define LIMIT1_PIN A1

//stepper
#define TR_DIRECTION_PIN 5
#define TR_STEP_PIN 6
#define TR_SPR 200	
#define GS_NO_ACCEL	

#endif

// sensor.h
#ifndef _SENSOR_h
#define _SENSOR_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif

class SensorClass {

public:
	SensorClass(uint8_t pin);
	boolean get();
	uint8_t getPin();
private:
	uint8_t _pin;
	void	init(uint8_t pin);
};
#endif


//sensor.cpp
#include "sensor.h"

SensorClass::SensorClass(uint8_t pin) {
	init(pin);
}

void SensorClass::init(uint8_t pin) {
	_pin = pin;
	pinMode(_pin, INPUT_PULLUP);
}
boolean SensorClass::get() {
	return !digitalRead(_pin);
}
uint8_t SensorClass::getPin() {
	return _pin;
}

// traverse.h
#ifndef _TRAVERSE_h
#define _TRAVERSE_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "arduino.h"
#else
	#include "WProgram.h"
#endif
#include <GyverStepper2.h>

const  int8_t _trLeft = -1;		
const  int8_t _trRight = 1;		
const uint8_t _trMicroStep[] = { 1, 2, 4, 8, 16, 32 };

class TraverseClass : public GStepper2<STEPPER2WIRE>
{
 public:

	 TraverseClass(uint16_t steps, uint8_t pin1 = 255, uint8_t pin2 = 255, uint8_t pin3 = 255, uint8_t pin4 = 255, uint8_t pin5 = 255) : GStepper2(steps, pin1 = 255, pin2 = 255, pin3 = 255, pin4 = 255, pin5 = 255) {}
	 void init();
	 boolean calibrate();
	 void setCalibrated(boolean flag);
	 boolean getCalibrated();
	 boolean _calibrated = false;

	 //Traverse
	 int16_t _trSetMaxSpeed;
	 boolean	_trSetDirection;
	 uint8_t _trSetMSMode;
	 uint16_t _trSetStepLength;
	 uint16_t _trSetSPR;
	 int32_t _trMaxSpeedMS;
	 uint16_t _trStepLengthMS;

	 //Spools
	 uint16_t _spoolSetStartPosition;
	 uint16_t _spoolSetEndPosition;
	 uint16_t _spoolSetSpoolWidth;
	 uint8_t _spoolSetNumberOfSpools;
	 uint8_t _currentSpool;
	 uint16_t _spoolSetStartPositionMS;
	 uint16_t _spoolSetEndPositionMS;
	 uint16_t _spoolSetSpoolWidthMS;
};
#endif

//traverse.cpp

#include "traverse.h"

#include <LiquidCrystal_I2C.h>
class  LiquidCrystal_I2C;
extern LiquidCrystal_I2C lcd;

#include "sensor.h"
class SensorClass;
extern SensorClass sensLimit1;


void TraverseClass::init() {

	//Traverse
	_trSetMaxSpeed = 800;
	_trSetDirection = false;
	_trSetMSMode = 2;
	_trSetStepLength = 400;
	_trSetSPR = 200;
	_trMaxSpeedMS = _trSetMaxSpeed * _trMicroStep[_trSetMSMode];
	_trStepLengthMS = _trSetStepLength / _trMicroStep[_trSetMSMode];

	reverse(_trSetDirection);
	setMaxSpeed(_trMaxSpeedMS);
	setAcceleration(_trMaxSpeedMS);

	//Spools
	_spoolSetStartPosition = 500;
	_spoolSetEndPosition = 1000;
	_spoolSetSpoolWidth = 1050;
	_spoolSetNumberOfSpools = 3;
	_currentSpool = 0;
	_spoolSetStartPositionMS = _trMicroStep[_trSetMSMode] * _spoolSetStartPosition;
	_spoolSetEndPositionMS = _trMicroStep[_trSetMSMode] * _spoolSetEndPosition;
	_spoolSetSpoolWidthMS = _trMicroStep[_trSetMSMode] * _spoolSetSpoolWidth;
}

boolean TraverseClass::calibrate() {

	lcd.home();
	lcd.print(F("Moving to 0 pos."));
	lcd.setCursor(0, 1);
	lcd.print(F("Please wait...  "));

	Serial.println(F("Moving to 0 pos...."));

	//delay(2000); //just to see printed on lcd 

	setSpeed(_trMaxSpeedMS);
	dir = _trLeft;
	do {
		tick();
	} while (!sensLimit1.get());

	brake();
	reset();

	lcd.home();
	lcd.print(F("Moving 2 the end"));
	lcd.setCursor(0, 1);
	lcd.print(F("Please wait...  "));

	Serial.println(F("Moving to 2nd pos...."));

	dir = _trRight;
	setTarget(_spoolSetEndPositionMS);
	do {
		tick();
	} while (!ready());
	
	lcd.home();							          //THIS CODE DOESN'T WORK!!!
	lcd.print(F("Done            "));	//THIS CODE DOESN'T WORK!!!
	lcd.setCursor(0, 1);				      //THIS CODE DOESN'T WORK!!!
	lcd.print(F("                "));	//THIS CODE DOESN'T WORK!!!

	Serial.println(F("done in method"));

	setCalibrated(true);
	return true;
}

void TraverseClass::setCalibrated(boolean flag) {
	_calibrated = flag;
}

boolean TraverseClass::getCalibrated() {
	return _calibrated;
}

//TraverseClass Traverse;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

не все  LiquidCrystal_I2C.h одинаковы

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Сейчас лень разбираться (устал, очки уже нос натирают), но заметил множественное подключение одних и тех же библиотек. Я думаю тебе нужно пересмотреть логику.
Смотри, деректика #include это как «вставка». То есть все то, что находится в файле после детективы #include «имя файла» будет подставлено именно в это самое место. Если это знать и понимать, то разбивать на файлы код не сложно. Попробуй ещё раз имея эти знания.