Нужна помощь
- Войдите на сайт для отправки комментариев
Пнд, 11/03/2019 - 14:04
Здравствуйте
Возникла проблема. Делал я свой маленький проект и столкнулс с тем что скетч не помещается на ардуино.
А хотелось еще некоторые вещи добавить
может может кто подсказать в каком направлении копать?
001 | #include <UTFT.h> // подключаем библиотеку UTFT |
002 | #include <Wire.h> |
003 | #include <DS1307.h> |
004 | #include <iarduino_RTC.h> |
005 | #include <OneWire.h> |
006 | #include <DallasTemperature.h> |
007 | //#include <PCF8574.h> |
008 | #include "DHT.h" |
009 | #include <RH_ASK.h> |
010 | //#include <SPI.h> |
011 |
012 | RH_ASK driver; |
013 | // структура должна быть в точности одинакова для передатчика и для приемника! |
014 | struct SEND_DATA_STRUCTURE{ |
015 | uint8_t tempWater; |
016 | uint8_t ounces; |
017 | uint8_t result; |
018 | uint8_t sensorValue; |
019 | }; |
020 | SEND_DATA_STRUCTURE mydata; |
021 | byte tx_buf[ sizeof (mydata)] = {}; |
022 |
023 |
024 | #define DHTPIN 13 // номер пина, к которому подсоединен датчик температуры и влажности |
025 | DHT dht(DHTPIN, DHT11); // Инициируем датчик |
026 |
027 | iarduino_RTC time(RTC_DS3231); //Запуск часов реального времени |
028 | DS1307 rtc(SDA, SCL); //Инициализируем входы |
029 | extern uint8_t SmallFont[]; // подключаем маленький шрифт |
030 | extern uint8_t BigFont[]; // подключаем большой шрифт |
031 | extern uint8_t DotMatrix_M[]; //Подключаем шрифт DotMatrix_M |
032 | UTFT myGLCD(TFT28UNO, A2,A1,A3,A4,A0); // тип дисплея 2,8 UNO (320x240 chip ILI9341) |
033 | |
034 | OneWire oneWire(10); // вход датчиков 18b20 датчики температуры |
035 | DallasTemperature ds(&oneWire); //Запуск датчиков |
036 |
037 | DeviceAddress Temp_Out = {0x28, 0xFF, 0x60, 0x1, 0xA7, 0x16, 0x3, 0xFE}; //Адреса датчиков температуры |
038 | DeviceAddress Temp_Cool = {0x28, 0xFF, 0x3, 0xD0, 0xA6, 0x16, 0x5, 0x59}; |
039 | |
040 |
041 | //PCF8574 expander; //Включение расширителя портов |
042 |
043 | void setup () |
044 | { |
045 | myGLCD.InitLCD(); // инициируем дисплей (в качестве параметра данной функции можно указать ориентацию дисплея: PORTRAIT или LANDSCAPE), по умолчанию LANDSCAPE - горизонтальная ориентация |
046 | time.begin(); //Запускаем часы |
047 | myGLCD.fillScr(0, 0, 0); //Закрашиваем дисплей черным цветом |
048 | dht.begin(); //Запуск часов |
049 | ds.begin(); //Запуск датчиков температуры |
050 | pinMode(12, OUTPUT); |
051 | // expander.begin(0x3A); //Запуск расширителя |
052 | // expander.pinMode(0, OUTPUT); //Используемый пин |
053 | Serial .begin(9600); // Скорость передачиданных |
054 | if (!driver.init()) |
055 | Serial .println( "init failed" ); |
056 | |
057 | |
058 | } |
059 | uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; |
060 | uint8_t buflen = sizeof (buf); |
061 |
062 | void loop () |
063 |
064 | { |
065 | myGLCD.setFont(BigFont); // устанавливаем большой шрифт |
066 | myGLCD.setColor(VGA_WHITE); // устанавливаем цвет текста |
067 | myGLCD.print( "WATER" , LEFT, 70); // выводим текст на дисплей |
068 | myGLCD.print( "GAZ" , RIGHT, 70); //Вывод текста уровня воды |
069 | myGLCD.print( "TEMP IN" , CENTER, 70); //Выводим текст температуру внутри |
070 | myGLCD.setFont(SmallFont); // устанавливаем маленький шрифт |
071 | myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста |
072 | myGLCD.print( "TEMP WATER" , LEFT, 150); // выводим текст на дисплей |
073 | myGLCD.print( "TEMP COOL" , RIGHT, 150); // выводим текст на дисплей |
074 | myGLCD.print( "TEMP OUT" , CENTER, 150); // выводим текст на дисплей |
075 | |
076 | if (driver.recv(buf,&buflen)) // Non-blocking |
077 | { |
078 | |
079 | memcpy(&mydata, buf, sizeof (mydata)); |
080 |
081 |
082 |
083 | uint8_t result=( int )round(mydata.result); |
084 | uint8_t sensorValue=( int )round(mydata.sensorValue); |
085 | uint8_t tempWater=( int )round(mydata.tempWater); |
086 | uint8_t ounces=( int )round(mydata.ounces); |
087 |
088 | myGLCD.setFont(DotMatrix_M); // устанавливаем цифровой шрифт |
089 | myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста |
090 | myGLCD.print(time.gettime( "d-m-Y H:i:s" ), CENTER, 10); // выводим время на дисплей |
091 | |
092 | myGLCD.setFont(BigFont); // устанавливаем большой шрифт |
093 | myGLCD.setColor(VGA_WHITE); // устанавливаем цвет текста |
094 | //myGLCD.print(" %", LEFT, 90); |
095 | myGLCD.printNumI(result, LEFT, 90); //Выводим переменную уровень воды |
096 | //myGLCD.print(" %", RIGHT, 90); |
097 | myGLCD.printNumI(sensorValue, 260, 90); //Выводим переменную уровень газа |
098 | |
099 | //Ввыводим температуру внутри |
100 | int Temp_IN = dht.readTemperature(); |
101 | //myGLCD.print(" `C", 110, 90); |
102 | myGLCD.printNumI(Temp_IN, CENTER, 90); //Выводим переменную температура внутри |
103 |
104 | myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста |
105 |
106 |
107 | ds.requestTemperatures(); // считываем температуру с датчиков |
108 |
109 | //myGLCD.print(" `C", 110, 170); |
110 | myGLCD.printNumI(ds.getTempC(Temp_Out), CENTER, 170); //Выводим переменную температура |
111 | //myGLCD.print(" `C", LEFT, 170); |
112 | myGLCD.printNumI(tempWater, LEFT, 170); //Выводим переменную температура воды |
113 | //myGLCD.print(" `C", RIGHT, 170); |
114 | myGLCD.printNumI(ds.getTempC(Temp_Cool), 220, 170); //Выводим переменную температура |
115 |
116 | Serial .print( "Температура " ); |
117 | Serial .print( tempWater ); |
118 | Serial .println( "C" ); |
119 | Serial .print( "Уровень газа " ); |
120 | Serial .print( sensorValue ); |
121 | Serial .println( "%" ); |
122 | Serial .print( "Уровень воды " ); |
123 | Serial .print( result ); |
124 | Serial .println( "%" ); |
125 |
126 | } |
127 |
128 |
129 | } |
Библиотеку UTFT настроил только на свой экран.
может можно остальные библиотеки сократить или без них сделать?
а что не помещается - программа во флеш или данные в ОЗУ ?
Что пишет компилятор после сборки скетча?
размер 32238 байт и если убрать закоментированые строки размер становится больше 32256 и компилятор не загружает скетч.
А если еще включить библиотеку расширителя портов то еще несколько Кбайт добовляется.
Просто думал что уже закончил уже собрал все в корпус, а памяти не хватает.
Самое простое - не использовать Serial:
// Serial.begin(9600);
и т.д.
Serial нужен
выводится на сотовый через модуль bluetooth
у вас стоит библиотека UTFT от каких-то продавцов. Попробуйте скачать нормальную с гитхаба - может будет меньше места занимать. Не должна библиотека дисплея быть такой огромной.
Ну, смотрите, у Вас же всё свалено в кучу. Что у Вас делают одновременно библиотеки в строках №№ 3 и 4. Более того, через одну Вы описываете часы 3231, а через другую - 1307. У Вас двое часов? Или зачем Вы их оба описали?
Зачем описана переменная rtc в строке 28, если она нигде никогда не используется? Для чего она? Чтобы оправдать включение соответсвующей библиотеки?
Далее, Вы не используете плавающую точку (если я не проглядел), но два килобайта библиотеки float Вы честно притянули (т.к. её притягивает DallasTemperature). Вот одно это (отказ от этой библиотеки или небольшая её модификация) позволило бы решить проблему.
Кстати, Вы вроде используете А4 для дисплея. А часы как подключены?
Скачал отсюда https://github.com/amperka/UTFT
не сильно помогло
Так и не поможет, если по двое часов заводить и плавающую точку на ровном месте притягивать :)
Думаю, что DHT library тоже внутре точки сплавляет. Так что одним далласом тут не отделаешься. Всю систему надо менять (TM).
Ну, значит, и её чуток подправить. В далласе то там это точно не нужно - можно смело заменить на целые (с умом, конечно). При точности датчика в полградуса, считать температуру а "десятых долях градуса" целыми числами - ничего не потеряем.
Ну, смотрите, у Вас же всё свалено в кучу. Что у Вас делают одновременно библиотеки в строках №№ 3 и 4. Более того, через одну Вы описываете часы 3231, а через другую - 1307. У Вас двое часов? Или зачем Вы их оба описали?
Часы одни я чтото даже не заметил
Зачем описана переменная rtc в строке 28, если она нигде никогда не используется? Для чего она? Чтобы оправдать включение соответсвующей библиотеки?
переменную убрал
Далее, Вы не используете плавающую точку (если я не проглядел), но два килобайта библиотеки float Вы честно притянули (т.к. её притягивает DallasTemperature). Вот одно это (отказ от этой библиотеки или небольшая её модификация) позволило бы решить проблему.
вот тут если не трудно немного поподробней куда и что модифицировать?
Кстати, Вы вроде используете А4 для дисплея. А часы как подключены?
часы подключены на SDA и SCL
001
#include <UTFT.h> // подключаем библиотеку UTFT
002
#include <Wire.h>
003
#include <iarduino_RTC.h>
004
#include <OneWire.h>
005
#include <DallasTemperature.h>
006
//#include <PCF8574.h>
007
#include "DHT.h"
008
#include <RH_ASK.h>
009
//#include <SPI.h>
010
011
RH_ASK driver;
012
// структура должна быть в точности одинакова для передатчика и для приемника!
013
struct
SEND_DATA_STRUCTURE{
014
uint8_t tempWater;
015
uint8_t ounces;
016
uint8_t result;
017
uint8_t sensorValue;
018
};
019
SEND_DATA_STRUCTURE mydata;
020
byte
tx_buf[
sizeof
(mydata)] = {};
021
022
023
#define DHTPIN 13 // номер пина, к которому подсоединен датчик температуры и влажности
024
DHT dht(DHTPIN, DHT11);
// Инициируем датчик
025
026
iarduino_RTC time(RTC_DS3231);
//Запуск часов реального времени
027
extern
uint8_t SmallFont[];
// подключаем маленький шрифт
028
extern
uint8_t BigFont[];
// подключаем большой шрифт
029
extern
uint8_t DotMatrix_M[];
//Подключаем шрифт DotMatrix_M
030
UTFT myGLCD(TFT28UNO, A2,A1,A3,A4,A0);
// тип дисплея 2,8 UNO (320x240 chip ILI9341)
031
032
OneWire oneWire(10);
// вход датчиков 18b20 датчики температуры
033
DallasTemperature ds(&oneWire);
//Запуск датчиков
034
035
DeviceAddress Temp_Out = {0x28, 0xFF, 0x60, 0x1, 0xA7, 0x16, 0x3, 0xFE};
//Адреса датчиков температуры
036
DeviceAddress Temp_Cool = {0x28, 0xFF, 0x3, 0xD0, 0xA6, 0x16, 0x5, 0x59};
037
038
039
//PCF8574 expander; //Включение расширителя портов
040
041
void
setup
()
042
{
043
myGLCD.InitLCD();
// инициируем дисплей (в качестве параметра данной функции можно указать ориентацию дисплея: PORTRAIT или LANDSCAPE), по умолчанию LANDSCAPE - горизонтальная ориентация
044
time.begin();
//Запускаем часы
045
myGLCD.fillScr(0, 0, 0);
//Закрашиваем дисплей черным цветом
046
dht.begin();
//Запуск часов
047
ds.begin();
//Запуск датчиков температуры
048
pinMode(12, OUTPUT);
049
// expander.begin(0x3A); //Запуск расширителя
050
// expander.pinMode(0, OUTPUT); //Используемый пин
051
Serial
.begin(9600);
// Скорость передачиданных
052
if
(!driver.init())
053
Serial
.println(
"init failed"
);
054
055
056
}
057
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
058
uint8_t buflen =
sizeof
(buf);
059
060
void
loop
()
061
062
{
063
myGLCD.setFont(BigFont);
// устанавливаем большой шрифт
064
myGLCD.setColor(VGA_WHITE);
// устанавливаем цвет текста
065
myGLCD.print(
"WATER"
, LEFT, 70);
// выводим текст на дисплей
066
myGLCD.print(
"GAZ"
, RIGHT, 70);
//Вывод текста уровня воды
067
myGLCD.print(
"TEMP IN"
, CENTER, 70);
//Выводим текст температуру внутри
068
myGLCD.setFont(SmallFont);
// устанавливаем маленький шрифт
069
myGLCD.setColor(VGA_FUCHSIA);
// устанавливаем цвет текста
070
myGLCD.print(
"TEMP WATER"
, LEFT, 150);
// выводим текст на дисплей
071
myGLCD.print(
"TEMP COOL"
, RIGHT, 150);
// выводим текст на дисплей
072
myGLCD.print(
"TEMP OUT"
, CENTER, 150);
// выводим текст на дисплей
073
074
if
(driver.recv(buf,&buflen))
// Non-blocking
075
{
076
077
memcpy(&mydata, buf,
sizeof
(mydata));
078
079
080
081
uint8_t result=(
int
)round(mydata.result);
082
uint8_t sensorValue=(
int
)round(mydata.sensorValue);
083
uint8_t tempWater=(
int
)round(mydata.tempWater);
084
uint8_t ounces=(
int
)round(mydata.ounces);
085
086
myGLCD.setFont(DotMatrix_M);
// устанавливаем цифровой шрифт
087
myGLCD.setColor(VGA_FUCHSIA);
// устанавливаем цвет текста
088
myGLCD.print(time.gettime(
"d-m-Y H:i:s"
), CENTER, 10);
// выводим время на дисплей
089
090
myGLCD.setFont(BigFont);
// устанавливаем большой шрифт
091
myGLCD.setColor(VGA_WHITE);
// устанавливаем цвет текста
092
//myGLCD.print(" %", LEFT, 90);
093
myGLCD.printNumI(result, LEFT, 90);
//Выводим переменную уровень воды
094
//myGLCD.print(" %", RIGHT, 90);
095
myGLCD.printNumI(sensorValue, 260, 90);
//Выводим переменную уровень газа
096
097
//Ввыводим температуру внутри
098
int
Temp_IN = dht.readTemperature();
099
//myGLCD.print(" `C", 110, 90);
100
myGLCD.printNumI(Temp_IN, CENTER, 90);
//Выводим переменную температура внутри
101
102
myGLCD.setColor(VGA_FUCHSIA);
// устанавливаем цвет текста
103
104
105
ds.requestTemperatures();
// считываем температуру с датчиков
106
107
//myGLCD.print(" `C", 110, 170);
108
myGLCD.printNumI(ds.getTempC(Temp_Out), CENTER, 170);
//Выводим переменную температура
109
//myGLCD.print(" `C", LEFT, 170);
110
myGLCD.printNumI(tempWater, LEFT, 170);
//Выводим переменную температура воды
111
//myGLCD.print(" `C", RIGHT, 170);
112
myGLCD.printNumI(ds.getTempC(Temp_Cool), 220, 170);
//Выводим переменную температура
113
114
Serial
.print(
"Температура "
);
115
Serial
.print( tempWater );
116
Serial
.println(
"C"
);
117
Serial
.print(
"Уровень газа "
);
118
Serial
.print( sensorValue );
119
Serial
.println(
"%"
);
120
Serial
.print(
"Уровень воды "
);
121
Serial
.print( result );
122
Serial
.println(
"%"
);
123
124
}
125
126
127
}
Файл memorysaver.h в библиотеке отредактировали? - там логика обратная. нужно закомментировать свой дисплей, а все прочие раскомментировать.
И еще - я не пойму, откуда вы берете фонт DotMatrix_M - в стандартных фонтах библиотеки такого нет
часы подключены на SDA и SCL
SDA это А4 - а Вы эту ногу ещё и для дисплея используете (см. строку №30 последнего скетча). Не подерутся?
вот тут если не трудно немного поподробней куда и что модифицировать?
Ну, вот смотрите, откройте DallasTemperature.cpp и пощите поиском слово float. Оно там использется много раз, но реально вычисления с плавающей точкой проиходят только в трёх функциях: toFahrenheit, toCelsius и calculateTemperature.
Первые две можно смело выбросить (если они Вам вдруг нужны, то их тоже можно переделать по той же методике, что я опишу для calculateTemperature). Заодно, надо выбросить функцию getTempF, т.к. она не рботает без toFahrenheit.
При выбрасывании, не забываем выбрасывать и из DallasTemperature.h тоже.
После того, как выбросили, делаете глобальную замену float на int16_t.
Затем лезете в функцию calculateTemperature и заменяете в ней все вычисления с плавающей точкой на целочисленные. Например, строку
1
return
(
float
)rawTemperature * 0.0625;
спокойно заменяете на
1
return
(int16_t)
2
((((int32_t)rawTemperature * 625L) + 500) / 1000);
строку
1
return
(
float
)(rawTemperature >> 1) * 0.125;
2
3
// заменяем на
4
5
return
(int16_t)
6
(((int32_t)(rawTemperature >> 1) * 125 + 50) / 100);
и так далее.
В итоге у Вас в программе не должно остаться слова float и констант с точкой - ни одной.
Ваша функция теперь возвращает не градусы, а "десятые доли градусов" == "температуру, умножннную на 10", т.е. последнюю цифру Вам надо печатать после запятой.
Зато Вы избавились от плавающей точки.
Коллега тут писал, что надо также поступить и библиотекой DHT.h, но не знаю. В той версии DHT, что у меня, нет никаких float. Проверьте. Если у Вас они есть - выкорчёвывайте также, как это дедлали для далласа. Если Вы выкорчуете ВСЕ float, Вы освободите примерно два килобайта.
Файл memorysaver.h в библиотеке отредактировали? - там логика обратная. нужно закомментировать свой дисплей, а все прочие раскомментировать.
да отредактировал
И еще - я не пойму, откуда вы берете фонт DotMatrix_M - в стандартных фонтах библиотеки такого нет
шрифт подключен дополнительно
понравилось отображение даты времени точками
Про фонт можете не отвечать - нашел.
У вас один только фонт DotMatrix занимает более 4к - при том что вы пользуетесь им всего в одном месте и реально вам нужны лишь цифры, двоеточие и тире. Либо откажитесь от этого фонта и выводите время фонтом BigFont. либо выкиньте из фонта DotMatrix лишние символы
Либо откажитесь от этого фонта и выводите время фонтом BigFont. либо выкиньте из фонта DotMatrix лишние символы
По мне так лучше отказаться. Но если
понравилось отображение даты времени точками
то сделайте, как говорит коллега - выбросьте лишние символы, а их там миниму 2/3 лишних.
Либо откажитесь от этого фонта и выводите время фонтом BigFont. либо выкиньте из фонта DotMatrix лишние символы
По мне так лучше отказаться.
там в наборе фонтов есть DotMatrix_M_Num - в котором только цифры. В него всего-то надо добавить тире и двоеточие - экономия места составит, думаю, не менее 3к
Тем более
При точности датчика в полградуса, ............
Недобрый Вы, Евгений Петрович, далласа маво, любимого, забижаете. А у него, только младший разряд бывает фулиганит. Нехорошос, на маленьких, наговаривать.(((
я тоже не понимаю, нахрена знать температуру с точностью 0.0625?
Кабутто, если на улице будет не -44, а -43.9375, то я сразу прям согреюсь.
Понаделают поделок, вместо обычного спиртового термометра, потом сами и за точность плачуца. Многая знания - многая пичалька.
Либо откажитесь от этого фонта и выводите время фонтом BigFont. либо выкиньте из фонта DotMatrix лишние символы
По мне так лучше отказаться.
там в наборе фонтов есть DotMatrix_M_Num - в котором только цифры. В него всего-то надо добавить тире и двоеточие - экономия места составит, думаю, не менее 3к
Проработал со шрифтом
размер существенно уменьшился спасибо большое
часы подключены на SDA и SCL
SDA это А4 - а Вы эту ногу ещё и для дисплея используете (см. строку №30 последнего скетча). Не подерутся?
[quote]
А4 на экране освобожден (это сброс подключил к питанию)
я тоже не понимаю, нахрена знать температуру с точностью 0.0625?
Кабутто, если на улице будет не -44, а -43.9375, то я сразу прям согреюсь.
Понаделают поделок, вместо обычного спиртового термометра, потом сами и за точность плачуца. Многая знания - многая пичалька.
От, чтобы сделать спиртовой термометр, надо получить спирит, а там такая разрядность и нужна, у него весь коридорчик 0,2гр. А точность, не требуется, там температура относительная.))))
А его, незаслуженно оскорбили, все прочитают и решат, что он только +-0,5гр умеет, а это не так. Я за справедливость.)))
Всем спасибо за помощь
с редактированием библиотек у меня не получилось да и наверно не поможет
принято решение перейти на Mega 2560 pro
надеюсь там памяти хватит )))
:)
Хватит. До следующей хотелки :)
я тоже не понимаю, нахрена знать температуру с точностью 0.0625?
Кабутто, если на улице будет не -44, а -43.9375, то я сразу прям согреюсь.
Понаделают поделок, вместо обычного спиртового термометра, потом сами и за точность плачуца. Многая знания - многая пичалька.
Тут немного не о том речь: точность этой микросхемы-термометра составляет +/- 0,5 градуса. То есть, при температуре 50 градусов данные могут приходить в зависимости от экземпляра от 49,5 до 50,5 градусов. А указанные 0.0625 - это величина изменения температуры, на которую реагирует датчик.
я тоже не понимаю, нахрена знать температуру с точностью 0.0625?
Кабутто, если на улице будет не -44, а -43.9375, то я сразу прям согреюсь.
Понаделают поделок, вместо обычного спиртового термометра, потом сами и за точность плачуца. Многая знания - многая пичалька.
Тут немного не о том речь: точность этой микросхемы-термометра составляет +/- 0,5 градуса. То есть, при температуре 50 градусов данные могут приходить в зависимости от экземпляра от 49,5 до 50,5 градусов. А указанные 0.0625 - это величина изменения температуры, на которую реагирует датчик.
речь о том, что 9-битное преобразование температуры (достоверное с точностью до полградуса) делается за 80 мс, а никому нахрен ненужное уточнение с разрешающей способностью 12 бит (0.0625 гра), а с точностью ВСЁРАВНО полградуса длится 750 мс. Вот и подумаешь, а так ли тебе в температуре нужны цифры после запятой.
0.0625 - это дискретность изменения показаний при 12-битном АЦП.
Практическую точность можно существенно увеличить, если внести поправочные коэффициенты в формулу T =a +bt в нужном Вам диапазоне температур.
Вот никогда не поверю, что кому то нужна точность измерения температуры 0,1*С во всём диапазоне датчика.
Спиртовикам - около 70...80 *С
Инкубаторщикам - около 40*С
Ну и так далее.
0.0625 - это дискретность изменения показаний при 12-битном АЦП.
Практическую точность можно существенно увеличить, если внести поправочные коэффициенты в формулу T =a +bt в нужном Вам диапазоне температур.
Вот никогда не поверю, что кому то нужна точность измерения температуры 0,1*С во всём диапазоне датчика.
Спиртовикам - около 70...80 *С
Инкубаторщикам - около 40*С
Ну и так далее.
Ну так наседка же всегда регулирует с точностью 0.0625.
Хм, у наседки, это профессия. Но Вас ведь не удивляет способность делать тоже самое.))))