В Serial показания датчиков выводит - на ST7735 нет.

yeee
Offline
Зарегистрирован: 17.08.2019
#include <SFE_BMP180.h> 
#include <Wire.h> 
#include <DS3231.h> 
#include <DHT.h> 
#include <TFT.h> 
#include <SPI.h> 

#define cs 10  
#define dc 9 
#define rst 8

SFE_BMP180 pressure;  
int DHTPIN = 2;
DHT dht(DHTPIN, DHT22); 
unsigned long sec_60;  
TFT TFTscreen = TFT(cs, dc, rst); 
DS3231 clock; 
RTCDateTime dt;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pressure.begin();
  TFTscreen.begin();
  clock.begin(); 
  // Manual (YYYY, MM, DD, HH, II, SS
  //clock.setDateTime(2020, 2, 13, 21, 30, 00);
}

void loop() 
{ 
  goto first_launching;
  circle: 
  if (millis() - sec_60 > 60000){ 
  sec_60 = millis();
  first_launching:
  int h = dht.readHumidity();
  int t = dht.readTemperature(); 
  double T, P;
  pressure.getPressure(P, T);
  Serial.println(h);
  Serial.println(t); 
  Serial.println(P,2); 
  TFTscreen.background(0, 0, 0);
  dt = clock.getDateTime(); 
  TFTscreen.setTextSize(5); 
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(clock.dateFormat("H:i:s", dt),7,10); 
  TFTscreen.setTextSize(2); 
  TFTscreen.stroke(242, 133, 7); 
  TFTscreen.text(dht.readHumidity("h"), 20, 90); 
  TFTscreen.text(clock.dateFormat("d.m.Y", dt), 20, 110); 
  }
  goto circle; 
}

Не знаю, как работать с чтением температуры и влажности для вывода на экран. В сериал выводит данные в типе int, да дисплей просит float, но при изменении с int на float все равно ничего не выходит. Пробовал по-разному, никак не работает. В проекте: TFT ST7735, DHT22, BMP180, DS3231

sadman41
Offline
Зарегистрирован: 19.10.2016

Example к библиотеке TFT рисует цифири на экране?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так Вы же разные вещи выводит на экран и в сериал. Попробуйте выводить одинаковые, чтобы хоть понятно было в чём беда.

yeee
Offline
Зарегистрирован: 17.08.2019

sadman41 пишет:
Example к библиотеке TFT рисует цифири на экране?

Да

ЕвгенийП пишет:

Так Вы же разные вещи выводит на экран и в сериал. Попробуйте выводить одинаковые, чтобы хоть понятно было в чём беда.

Извиняюсь, как в сериал тоже пробовал, ничего не вышло и я начал экспериментировать, тоже нифига.
 

P. S. не знаю что еще написать к этому дефекту

yeee
Offline
Зарегистрирован: 17.08.2019
 float h = dht.readHumidity();
  float t = dht.readTemperature(); 
  double T, P;
  pressure.getPressure(P, T);
  Serial.println(h);
  Serial.println(t); 
  Serial.println(P,2); 
  TFTscreen.background(0, 0, 0);
  dt = clock.getDateTime(); 
  TFTscreen.setTextSize(5); 
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(clock.dateFormat("H:i:s", dt),7,10); 
  TFTscreen.setTextSize(2); 
  TFTscreen.stroke(242, 133, 7); 
  TFTscreen.text(dht.readHumidity("h"), 20, 90); 
  TFTscreen.text(clock.dateFormat("d.m.Y", dt), 20, 110); 

Выглядит как адекватное решение, но компилятор выдает:
 

unity.ino: In function 'void loop()':
unity:51: error: no matching function for call to 'TFT::text(float, int, int)'
C:\Users\UserOne\Desktop\arduino-1.0.5-r2\libraries\TFT/utility/Adafruit_GFX.h:166: note: candidates are: void Adafruit_GFX::text(const char*, int16_t, int16_t)
 
sadman41
Offline
Зарегистрирован: 19.10.2016

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee пишет:

P. S. не знаю что еще написать к этому дефекту

Напишите вывод одного и того же - одинаковых переменных. И выложите

1) скетч
2) протокол того, что вывелось в сериал (копипастом)
3) фото того, что вывелось на экран

yeee
Offline
Зарегистрирован: 17.08.2019

  TFTscreen.text("15", 20, 90); 
Выводит как ASCII, в кавычках, в типе float

yeee
Offline
Зарегистрирован: 17.08.2019

скетч переписывать не буду, меняется по сути 1-2 строки:

1.

float h = dht.readHumidity();
TFTscreen.text((h), 20, 90); // :(
Serial.println(h); //comletely, "68.10" %
unity.ino: In function 'void loop()':
unity:51: error: no matching function for call to 'TFT::text(float, int, int)'
C:\Users\этот коипьютер\Desktop\arduino-1.0.5-r2\libraries\TFT/utility/Adafruit_GFX.h:166: note: candidates are: void Adafruit_GFX::text(const char*, int16_t, int16_t)
 

2.

float h = dht.readHumidity();
TFTscreen.text(h, 20, 90); // :(
Serial.println(h); //comletely, "68.10" %
unity.ino: In function 'void loop()':
unity:51: error: no matching function for call to 'TFT::text(float&, int, int)'
C:\Users\этот коипьютер\Desktop\arduino-1.0.5-r2\libraries\TFT/utility/Adafruit_GFX.h:166: note: candidates are: void Adafruit_GFX::text(const char*, int16_t, int16_t)

3.

Полный бред и набор бессмыслицы в тысячи вариантах исполнения, используя разные методы и ключевые слова

З. Ы. хоть инт, хоть флоат - сути не меняет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee пишет:

скетч переписывать не буду, меняется по сути 1-2 строки:

Т.е. делать то, что я Вас попросил в посте #6 Вы не будете, и я не увижу что и как у Вас печатается, чтобы понять в чём проблема?

Ну, тогда, извините, хорошего вечера.

yeee
Offline
Зарегистрирован: 17.08.2019

ЕвгенийП пишет:

yeee пишет:

скетч переписывать не буду, меняется по сути 1-2 строки:

Т.е. делать то, что я Вас попросил в посте #6 Вы не будете, и я не увижу что и как у Вас печатается, чтобы понять в чём проблема?

Ну, тогда, извините, хорошего вечера.

Хочу, чтобы Вы обратили внимание на пост #1.

b707
Offline
Зарегистрирован: 26.05.2017

Yee, а откуда вдруг идея, что ТФТ нужен флоат? Вы описание к библиотеке не пробовали читать?

b707
Offline
Зарегистрирован: 26.05.2017

yeee пишет:

Хочу, чтобы Вы обратили внимание на пост #1.

и на что там обращать внимание?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee пишет:

Хочу, чтобы Вы обратили внимание на пост #1.

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

yeee
Offline
Зарегистрирован: 17.08.2019

Хорошо, немного изменим суть вопроса. КАК ПРАВИЛЬНО преобразовать данные из int в const char чтобы вывести данные на экран. С сериалом проблем нет, все нормально преобразуется, здесь же что-то не идет.

#include <SFE_BMP180.h> 
#include <Wire.h> 
#include <DS3231.h> 
#include <DHT.h> 
#include <TFT.h> 
#include <SPI.h> 

#define cs 10  
#define dc 9 
#define rst 8

SFE_BMP180 pressure;  
int DHTPIN = 2;
DHT dht(DHTPIN, DHT22); 
unsigned long sec_60;  
TFT TFTscreen = TFT(cs, dc, rst); 
DS3231 clock; 
RTCDateTime dt;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pressure.begin();
  TFTscreen.begin();
  clock.begin(); 
  // Manual (YYYY, MM, DD, HH, II, SS
  //clock.setDateTime(2020, 2, 13, 21, 30, 00);
}


void loop() 
{ 
  goto first_launching;
  circle: 
  if (millis() - sec_60 > 60000){ 
  sec_60 = millis();
  first_launching:
  int h = dht.readHumidity();
  int t = dht.readTemperature(); 
  double T, P;
  pressure.getPressure(P, T);
  Serial.println(h);
  Serial.println(t); 
  Serial.println(P,2); 
  TFTscreen.background(0, 0, 0);
  dt = clock.getDateTime(); 
  TFTscreen.setTextSize(5); 
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(clock.dateFormat("H:i:s", dt),7,10); 
  TFTscreen.setTextSize(2); 
  TFTscreen.stroke(242, 133, 7); 
  TFTscreen.text(h, 20, 90); 
  TFTscreen.text(clock.dateFormat("d.m.Y", dt), 20, 110); 
  }
  goto circle; 
}
unity.ino: In function 'void loop()':
unity:51: error: invalid conversion from 'int' to 'const char*'
unity:51: error: initializing argument 1 of 'void Adafruit_GFX::text(const char*, int16_t, int16_t)'
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

через String к примеру

yeee
Offline
Зарегистрирован: 17.08.2019

не определяется как ключевое слово (не подсвечивается оранжевым)

b707
Offline
Зарегистрирован: 26.05.2017

Yee, посмотрите соседнюю тему "работа с ТФТ дисплеем", там пример вывода

sadman41
Offline
Зарегистрирован: 19.10.2016

Ссылка на библиотеку TFT засветить.

yeee
Offline
Зарегистрирован: 17.08.2019
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Неплохо бы показать и сам дисплейчик. А то может он "не той системы".

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну вот же, пример как вывести int.

char sensorPrintout[4];
...
String sensorVal = String(analogRead(A0));
sensorVal.toCharArray(sensorPrintout, 4);
TFTscreen.stroke(255,255,255);
TFTscreen.text(sensorPrintout, 0, 20);
...

 

yeee
Offline
Зарегистрирован: 17.08.2019

ST7735, 1.8''

yeee
Offline
Зарегистрирован: 17.08.2019

пытался, мозг не осилил... будь я индивидом с iq выше 30, столько бы не мучался, сами понимаете... Попробую с другой библиотекой, мб что выйдет

yeee
Offline
Зарегистрирован: 17.08.2019

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, ёпрст, подставь вместо analogRead(A0) свои переменные. У меня такой же IQ, ничо, как-то стараюсь.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

https://www.youtube.com/watch?v=HIZzJJG-YeM     Повторите что делает автор ролика. И так пока не заработает скетч приведеный в ролике.

yeee
Offline
Зарегистрирован: 17.08.2019

sadman41 пишет:

Ну, ёпрст, подставь вместо analogRead(A0) свои переменные. У меня такой же IQ, ничо, как-то стараюсь.

Вы не видите, но я утек под стол от счастья! Спасибо Вам огромное! <3

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

Да, очень сложно было посмотреть тут

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Да, очень сложно было посмотреть тут

Это же не наш метод!

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

ЕвгенийП пишет:

ua6em пишет:

Да, очень сложно было посмотреть тут

Это же не наш метод!

я думал, что Вы за String сейчас побурчите, ан нет )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

я думал, что Вы за String сейчас побурчите, ан нет )))

Вы меня с кем-то путаете. А не делэефоб, не стрингофоб, не гоутуфоб и т.п. Я совершенно нормально отношусь ко всем этим прекрасным вещам :-)

yeee
Offline
Зарегистрирован: 17.08.2019

ua6em пишет:

Да, очень сложно было посмотреть тут


Да смотрел я там, только путём ничего не понял, а потом sadman объяснил всё. Только сейчас вот думаю, как преобразовать показания с барометра (там по библиотеке тип данных double) так, чтобы перевести их в символы и вывести на дисплей. Через String не работает, компилятор пишет, что тип данных не подходит

yeee
Offline
Зарегистрирован: 17.08.2019




Разобрался. В стандартной библиотеке ардуино есть функция dtostrf
Вот её формат:
dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);

где:

floatvar - преобразуемая переменная типа float;

StringLengthIncDecimalPoint - длина получаемого символьного значения;

numVarsAfterDecimal - количество символов после запятой;

charbuf - символьный массив для сохранения результата преобразования

Только все равно ничего не выводится на экран, сижу дальше :)

yeee
Offline
Зарегистрирован: 17.08.2019

Интересное наблюдение: когда DHT22 не подключен к ардуино, показания с BMР180 нормально выводятся на экран, когда же датчик температуры/влажности стоит на своем законном месте и подключен к плате, давление на экран не выводит. А когда не подключен барометр, то показания влажности адекватные: 50-60% (хотя с ним доходит до 70-80%). Плюс, когда вывожу только показания с давлением, после двух чисел после запятой вылезают два рандомных символа

#include <SFE_BMP180.h> 
#include <Wire.h> 
#include <DS3231.h> 
#include <DHT.h> 
#include <TFT.h> 
#include <SPI.h> 

#define cs 10  
#define dc 9 
#define rst 8

SFE_BMP180 pressure;  
int DHTPIN = 2;
DHT dht(DHTPIN, DHT22); 
unsigned long sec_60;  
TFT TFTscreen = TFT(cs, dc, rst); 
DS3231 clock; 
RTCDateTime dt;
char Humidity[2];
char Temperature[2];
char Pressure[6];

void setup() {
  Serial.begin(9600);
  dht.begin();
  pressure.begin();
  TFTscreen.begin();
  clock.begin(); 
  // Manual (YYYY, MM, DD, HH, II, SS
  //clock.setDateTime(2020, 2, 13, 21, 30, 00);
}

void loop() 
{ 
  goto first_launching;
  circle: 
  if (millis() - sec_60 > 60000){ 
  sec_60 = millis();
  first_launching:
  int h = dht.readHumidity();
  int t = dht.readTemperature(); 
  double T, P;
  float p = 
  p = pressure.getPressure(P, T);
  dtostrf(P, 6, 2, Pressure);
  Serial.println(h);
  Serial.println(t); 
  Serial.println(P,2); 
  
  TFTscreen.background(0, 0, 0);
  dt = clock.getDateTime(); 
  TFTscreen.setTextSize(5); 
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.text(clock.dateFormat("H:i:s", dt),7,10); 
  TFTscreen.setTextSize(2); 
  TFTscreen.stroke(242, 133, 7); 
  
  String hum = String(h);
  hum.toCharArray(Humidity, 4);
  TFTscreen.text(Humidity, 20, 90);
  
  String temp = String(t);
  temp.toCharArray(Temperature, 4);
  TFTscreen.text(Temperature, 20, 70);
  
  TFTscreen.text(Pressure, 60, 70);
  
  TFTscreen.text(clock.dateFormat("d.m.Y", dt), 20, 110); 
  }
  goto circle; 
}

 

yeee
Offline
Зарегистрирован: 17.08.2019

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee,

Вы читаете, что Вам говорит компилятор? Или плевать на него?

У Вас в строках №№42-45 ошибок штук шесть - эти строки - вообще одна сплошная ошибка! Вы вообще, понимаете, что в этих строках написано? 

Вот например (одна ошибка из шести), Вы в строке №42 объявляете переменную Т, а потом передаёте её библиотеке. Вопрос: где, когда и при каких обстоятельствах Вы присвоили её хоть какое-то разумное значение?

yeee
Offline
Зарегистрирован: 17.08.2019

ЕвгенийП пишет:

yeee,

Вы читаете, что Вам говорит компилятор? Или плевать на него?

У Вас в строках №№42-45 ошибок штук шесть - эти строки - вообще одна сплошная ошибка! Вы вообще, понимаете, что в этих строках написано? 

Вот например (одна ошибка из шести), Вы в строке №42 объявляете переменную Т, а потом передаёте её библиотеке. Вопрос: где, когда и при каких обстоятельствах Вы присвоили её хоть какое-то разумное значение?

Компилятор пишет, что загрузка завершена) Переменная "t" осталась от прошлых попыток вывести значения давления на экран.

float p =
p = pressure.getPressure(P, T);

эти строки я удалил, извиняюсь, что забыл удалить их и здесь. А переменная Т это уже идет из библиотеки к BMP180, её значение равно давлению в миллибарах.

yeee
Offline
Зарегистрирован: 17.08.2019

ЕвгенийП пишет:

Вот например (одна ошибка из шести), Вы в строке №42 объявляете переменную Т, а потом передаёте её библиотеке. Вопрос: где, когда и при каких обстоятельствах Вы присвоили её хоть какое-то разумное значение?

https://github.com/LowPowerLab/SFE_BMP180

см. пример скетча

b707
Offline
Зарегистрирован: 26.05.2017

yeee пишет:

https://github.com/LowPowerLab/SFE_BMP180

см. пример скетча

ИМХО, в библиотеке пример с ошибкой

В самом коде библиотеки функция описана так

char SFE_BMP180::getPressure(double &P, double &T)

то есть надо передавать адреса переменных, а не значения. как в примере (и как у вас)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee пишет:
А переменная Т это уже идет из библиотеки к BMP180, её значение равно давлению в миллибарах.

Найдите того, кто это Вам сказал и плюньте в наглую рожу.

Это Вы должны передать T библиотеке, а не она Вам. Она его там использует. Вот текст этого метода - там и комментарий есть и использование видно.

char SFE_BMP180::getPressure(double &P, double &T)
// Retrieve a previously started pressure reading, calculate abolute pressure in mbars.
// Requires begin() to be called once prior to retrieve calibration parameters.
// Requires startPressure() to have been called prior and sufficient time elapsed.
// Requires recent temperature reading to accurately calculate pressure.

// P: external variable to hold pressure.
// T: previously-calculated temperature.
// Returns 1 for success, 0 for I2C error.

// Note that calculated pressure value is absolute mbars, to compensate for altitude call sealevel().
{
	unsigned char data[3];
	char result;
	double pu,s,x,y,z;

	data[0] = BMP180_REG_RESULT;

	result = readBytes(data, 3);
	if (result) // good read, calculate pressure
	{
		pu = (data[0] * 256.0) + data[1] + (data[2]/256.0);

		s = T - 25.0;
		x = (x2 * pow(s,2)) + (x1 * s) + x0;
		y = (y2 * pow(s,2)) + (y1 * s) + y0;
		z = (pu - x) / y;
		P = (p2 * pow(z,2)) + (p1 * z) + p0;
	}
	return(result);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

В самом коде библиотеки функция описана так

char SFE_BMP180::getPressure(double &P, double &T)

Дак это "передача по ссылке". Так что синтаксически верно, а вот алгоритмически - нет, ибо:

 

// P: external variable to hold pressure.
// T: previously-calculated temperature.
....
s = T - 25.0;

А вот T в коде yeee равна неизвестно чему и неизвестно что с ней сделает компилятор.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

то есть надо передавать адреса переменных, а не значения. как в примере (и как у вас)

Это ссылки, а не адреса. Передача внешне ничем не отличается от передачи значений.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Это ссылки, а не адреса. Передача внешне ничем не отличается от передачи значений.

рука-лицо :)

ОК, надо мне все ж таки серьезно в этом разобраться....

yeee
Offline
Зарегистрирован: 17.08.2019

Что-то я совсем запутался... А как тогда мне вывести данные на дисплей? Если не прописывать переменную Т, то что? И почему в моем случае давление не выводится на дисплей когда подключен DHT22???

sadman41
Offline
Зарегистрирован: 19.10.2016

Я вообще удивлен тому, что не зависает все сразу после того, как в двубайтовые массивы по четыре байта запихивают.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
Я вообще удивлен тому, что не зависает все сразу после того, как в двубайтовые массивы по четыре байта запихивают.

в некоторые по 4, а кое-куда даже 6 :)

yeee
Offline
Зарегистрирован: 17.08.2019

Самое интересное, что при четырехбайтовом массиве выводилось только первая цифра

Для меня это тоже загадка :)

b707
Offline
Зарегистрирован: 26.05.2017

yeee пишет:

Самое интересное, что при четырехбайтовом массиве выводилось только первая цифра

потому что массив для строчки давления должен быть длиной 7 байт

sadman41
Offline
Зарегистрирован: 19.10.2016

yeee, заремьте все, что связано с TFT, добейтесь чтобы в Serial выводились правильные текстовые строки. Дисплей пока мешается.

Массив может быть один, возьмите его с запасом, символов на 15 и используйте его в каждом преобразовании число->строка.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yeee пишет:

Что-то я совсем запутался... А как тогда мне вывести данные на дисплей? Если не прописывать переменную Т, то что? И почему в моем случае давление не выводится на дисплей когда подключен DHT22???

Вы прочитали тест программы, который я Вам привёл? Хотя бы комментарии? Нет? Так прочитайте! Фраза: "T: previously-calculated temperature" Вам ни о чём не говорит? Непонятно, что туда нужно передавать?