Нужна помощь
- Войдите на сайт для отправки комментариев
Пнд, 11/03/2019 - 14:04
Здравствуйте
Возникла проблема. Делал я свой маленький проект и столкнулс с тем что скетч не помещается на ардуино.
А хотелось еще некоторые вещи добавить
может может кто подсказать в каком направлении копать?
#include <UTFT.h> // подключаем библиотеку UTFT #include <Wire.h> #include <DS1307.h> #include <iarduino_RTC.h> #include <OneWire.h> #include <DallasTemperature.h> //#include <PCF8574.h> #include "DHT.h" #include <RH_ASK.h> //#include <SPI.h> RH_ASK driver; // структура должна быть в точности одинакова для передатчика и для приемника! struct SEND_DATA_STRUCTURE{ uint8_t tempWater; uint8_t ounces; uint8_t result; uint8_t sensorValue; }; SEND_DATA_STRUCTURE mydata; byte tx_buf[sizeof(mydata)] = {}; #define DHTPIN 13 // номер пина, к которому подсоединен датчик температуры и влажности DHT dht(DHTPIN, DHT11); // Инициируем датчик iarduino_RTC time(RTC_DS3231); //Запуск часов реального времени DS1307 rtc(SDA, SCL); //Инициализируем входы extern uint8_t SmallFont[]; // подключаем маленький шрифт extern uint8_t BigFont[]; // подключаем большой шрифт extern uint8_t DotMatrix_M[]; //Подключаем шрифт DotMatrix_M UTFT myGLCD(TFT28UNO, A2,A1,A3,A4,A0); // тип дисплея 2,8 UNO (320x240 chip ILI9341) OneWire oneWire(10); // вход датчиков 18b20 датчики температуры DallasTemperature ds(&oneWire); //Запуск датчиков DeviceAddress Temp_Out = {0x28, 0xFF, 0x60, 0x1, 0xA7, 0x16, 0x3, 0xFE}; //Адреса датчиков температуры DeviceAddress Temp_Cool = {0x28, 0xFF, 0x3, 0xD0, 0xA6, 0x16, 0x5, 0x59}; //PCF8574 expander; //Включение расширителя портов void setup() { myGLCD.InitLCD(); // инициируем дисплей (в качестве параметра данной функции можно указать ориентацию дисплея: PORTRAIT или LANDSCAPE), по умолчанию LANDSCAPE - горизонтальная ориентация time.begin(); //Запускаем часы myGLCD.fillScr(0, 0, 0); //Закрашиваем дисплей черным цветом dht.begin(); //Запуск часов ds.begin(); //Запуск датчиков температуры pinMode(12, OUTPUT); // expander.begin(0x3A); //Запуск расширителя // expander.pinMode(0, OUTPUT); //Используемый пин Serial.begin(9600); // Скорость передачиданных if (!driver.init()) Serial.println("init failed"); } uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(buf); void loop() { myGLCD.setFont(BigFont); // устанавливаем большой шрифт myGLCD.setColor(VGA_WHITE); // устанавливаем цвет текста myGLCD.print("WATER", LEFT, 70); // выводим текст на дисплей myGLCD.print("GAZ", RIGHT, 70); //Вывод текста уровня воды myGLCD.print("TEMP IN", CENTER, 70); //Выводим текст температуру внутри myGLCD.setFont(SmallFont); // устанавливаем маленький шрифт myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста myGLCD.print("TEMP WATER", LEFT, 150); // выводим текст на дисплей myGLCD.print("TEMP COOL", RIGHT, 150); // выводим текст на дисплей myGLCD.print("TEMP OUT", CENTER, 150); // выводим текст на дисплей if (driver.recv(buf,&buflen)) // Non-blocking { memcpy(&mydata, buf, sizeof(mydata)); uint8_t result=(int)round(mydata.result); uint8_t sensorValue=(int)round(mydata.sensorValue); uint8_t tempWater=(int)round(mydata.tempWater); uint8_t ounces=(int)round(mydata.ounces); myGLCD.setFont(DotMatrix_M); // устанавливаем цифровой шрифт myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста myGLCD.print(time.gettime("d-m-Y H:i:s"), CENTER, 10); // выводим время на дисплей myGLCD.setFont(BigFont); // устанавливаем большой шрифт myGLCD.setColor(VGA_WHITE); // устанавливаем цвет текста //myGLCD.print(" %", LEFT, 90); myGLCD.printNumI(result, LEFT, 90); //Выводим переменную уровень воды //myGLCD.print(" %", RIGHT, 90); myGLCD.printNumI(sensorValue, 260, 90); //Выводим переменную уровень газа //Ввыводим температуру внутри int Temp_IN = dht.readTemperature(); //myGLCD.print(" `C", 110, 90); myGLCD.printNumI(Temp_IN, CENTER, 90); //Выводим переменную температура внутри myGLCD.setColor(VGA_FUCHSIA); // устанавливаем цвет текста ds.requestTemperatures(); // считываем температуру с датчиков //myGLCD.print(" `C", 110, 170); myGLCD.printNumI(ds.getTempC(Temp_Out), CENTER, 170); //Выводим переменную температура //myGLCD.print(" `C", LEFT, 170); myGLCD.printNumI(tempWater, LEFT, 170); //Выводим переменную температура воды //myGLCD.print(" `C", RIGHT, 170); myGLCD.printNumI(ds.getTempC(Temp_Cool), 220, 170); //Выводим переменную температура Serial.print("Температура "); Serial.print( tempWater ); Serial.println("C"); Serial.print("Уровень газа "); Serial.print( sensorValue ); Serial.println("%"); Serial.print("Уровень воды "); Serial.print( result ); Serial.println("%"); } }
Библиотеку 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
Файл memorysaver.h в библиотеке отредактировали? - там логика обратная. нужно закомментировать свой дисплей, а все прочие раскомментировать.
И еще - я не пойму, откуда вы берете фонт DotMatrix_M - в стандартных фонтах библиотеки такого нет
часы подключены на SDA и SCL
SDA это А4 - а Вы эту ногу ещё и для дисплея используете (см. строку №30 последнего скетча). Не подерутся?
вот тут если не трудно немного поподробней куда и что модифицировать?
Ну, вот смотрите, откройте DallasTemperature.cpp и пощите поиском слово float. Оно там использется много раз, но реально вычисления с плавающей точкой проиходят только в трёх функциях: toFahrenheit, toCelsius и calculateTemperature.
Первые две можно смело выбросить (если они Вам вдруг нужны, то их тоже можно переделать по той же методике, что я опишу для calculateTemperature). Заодно, надо выбросить функцию getTempF, т.к. она не рботает без toFahrenheit.
При выбрасывании, не забываем выбрасывать и из DallasTemperature.h тоже.
После того, как выбросили, делаете глобальную замену float на int16_t.
Затем лезете в функцию calculateTemperature и заменяете в ней все вычисления с плавающей точкой на целочисленные. Например, строку
спокойно заменяете на
строку
и так далее.
В итоге у Вас в программе не должно остаться слова 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.
Хм, у наседки, это профессия. Но Вас ведь не удивляет способность делать тоже самое.))))