Проблемы при разделении скетча на файлы.
- Войдите на сайт для отправки комментариев
Вс, 06/11/2016 - 19:05
Здравствуйте. Вернулся в своему проекту спустя полгода. Проект мой был нацелен на написание некоторой погодной станции, с датчиками, пид-регуляторами и т.д. Все работало, когда он находился в 1 большом файле. Сегодня начал разделять его тем способом, который знаю и применял ранее на других скетчах. Столкнулся с проблемой, что часть функций работает, а часть нет.
Это код главного файла:
//================================================================================================= // НАЗВАНИЕ ПРОГРАММЫ: Погодная станция new // ВЕРСИЯ ПРОГРАММЫ: v2.0 // ВЕРСИЯ ARDUINO IDE: 1.0.5 r2 //================================================================================================= #include <OneWire.h> // ... #include <Wire.h> // I2C #include <LiquidCrystal.h> // LCD #include <PID_v1.h> // библиотека PID #include <EEPROM.h> // работа с eeprom, встроенным в ардуину. #include <SD.h> // работа с SD картой для сбора данных #include <DHT.h> // для датчика темп-влажности. #include <DS3231.h> #include <BMP085.h> unsigned long IntervalReadPressureSensorBMP085 = 2000; unsigned long IntervalReadSensorDHT = 2000; unsigned long IntervalReadButton = 300; unsigned long IntervalPrintSerial = 5000; unsigned long ValueMillisPreviousReadSensorBMP085 = 0, ValueMillisPreviousReadButton = 0, ValueMillisPreviousReadSensorDHT = 0, ValueMillisPreviousPrintSerial = 0; #define DHTPIN 2 ////#define DHTPIN2 3 // 2-й датчик температуры-влажности подключен к 3 цифр.пину. (датчик в помещении 1) //#define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT21 // DHT 21 (AM2301) #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 // 1-й датчик температуры-влажности подключен к 2 цифр.пину. (датчик на улице) DHT dht(DHTPIN, DHTTYPE); // Инициируем 1-датчик, в данном случае DHT22. ////DHT dht2(DHTPIN2, DHTTYPE); // Инициируем 1-датчик int t1,h1,t2,h2,v1,v2; // вводим переменные для значений температуры, влажности, давления. BMP085 dps = BMP085(); //для датчика давления. long Temperature = 0, Pressure = 0, Altitude = 0; Sd2Card card; // отображает переменные для SD карты, используя сервисные функции библиотеки SD: SdVolume volume; SdFile root; const int chipSelect = 53; // подключение зависит от используемого модуля sd и ардуины: при использовании Arduino Mega 2560 подключение на 53 пин. int ekran; //переменная для выбора экрана меню. int m=0; //переменная для экранов меню. File myFile; //??? long id; //??? int i=0; //переменная для мигания на экране изменяемых величин. int b=0; //переменая для аналоговой клавиатуры. int analogPin=2; //пин А2 для аналоговой клавиатуры. // LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); // для УНО. пины подключения к экрану 1602 или 2004 (A=5v/K=GND)(VSS+VO=GND/VDD=5v/RS=pin12/RW=pin11/E=pin10/D4=pin5/D5=pin4/D6=pin3/D7=pin2). LiquidCrystal lcd(22, 28, 23, 24, 25, 26, 27); // для МЕГИ 2560. (A=5v/K=GND)(VSS=GND/VDD=5v/RS=pin22/RW=pin28/E=pin23/D4=pin24/D5=pin25/D6=pin26/D7=pin27). DS3231 rtc(20, 21); //шина, на которую подключены часы (для ардуино нано на 328 чипе, это пины A4/A5)(для меги - пины 20/21). void setup(){ Serial.begin(9600); // инициализация сериал-монитора, для вывода любой инф-ии в порт. lcd.begin(20, 4); // инициализация экрана (20 символов в 4 строках). dht.begin(); // инициализация датчика температуры-влажности. rtc.begin(); // инициализация часов на DS3231. Wire.begin(); dps.init(); read_sdcard(); // Передаем информацию о найденной SD-карте в сериал (вкладка Send_Serial) privetstvie(); // Вывоим приветствие на экран при включении (название, версия и т.д.) (вкладка Read_LCD) } void loop(){ unsigned long currentMillis = millis(); //присваивание значения общей переменной отсчета времени. if(currentMillis - ValueMillisPreviousReadSensorBMP085 > IntervalReadPressureSensorBMP085) //Если счетчик превысил интервал, то: { read_sensor_bmp085(); ValueMillisPreviousReadSensorBMP085 = currentMillis; } // выполняем считывание показаний датчика BMP085. (вкладка Read_Sensor). if(currentMillis - ValueMillisPreviousReadSensorDHT > IntervalReadSensorDHT) //Если счетчик превысил интервал, то: { read_sensor_dht22(); ValueMillisPreviousReadSensorDHT = currentMillis; } // считываем температуру и влажность с датчиков DHT22. if(currentMillis - ValueMillisPreviousPrintSerial > IntervalPrintSerial) //Если счетчик превысил интервал, то: { print_serial(); ValueMillisPreviousPrintSerial = currentMillis; } //........ ReadButton(); // Считываем нажатие клавиш на клавиатуре. (вкладка Read_Button) NajatieUpDown(); // Обрабатываем нажатие клавиш Вверх/Вниз. (вкладка Read_Button) Ekran(); // выбор № отображаемого экрана в зав-ти от переменной "m" (вкладка Read_LCD) Read_ekran(); // Отображаем содержимое выбранного экрана (вкладка Read_LCD) }
Это вкладка Read_Button
//================================================================================================= // НАЧАЛО СЧИТЫВАНИЯ ЗНАЧЕНИЙ С КЛАВИАТУРЫ void ReadButton() { int c; c = analogRead(analogPin); if (c>950) { b=0; } // ни одна клавиша не нажата. else if (c>170 && c<200) { b=1; } // нажата кнопка 1 ВВЕРХ else if (c<30) { b=2; } // нажата кнопка 2 ВПРАВО else if (c>390 && c<420) { b=3; } // нажата кнопка 3 ВНИЗ else if (c>300 && c<330) { b=4; } // нажата кнопка 4 ВЛЕВО else if (c>465 && c<505) { b=5; } // нажата кнопка 5 ЦЕНТР } // КОНЕЦ СЧИТЫВАНИЯ ЗНАЧЕНИЙ С КЛАВИАТУРЫ //================================================================================================= //------------------------------------------------------------------------------------------------------------------------------ void NajatieUpDown() { //================================================================================================= // НАЧАЛО ОБРАБОТКИ НАЖАТИЯ КЛАВИШ ВВЕРХ/ВНИЗ. //Обработка нажатия NEXT (кнопка 3-вниз) if (b==3) {m++; //увеличиваем переменную уровня меню delay (100); lcd.clear(); if (m>2) {m=2;}} //если уровень больше 2, то оставаться на значении 2 //Обработка нажатия кнопки PREV (кнопка 1-вверх) if (b==1) {m--; delay (100); lcd.clear(); if (m<0) {m=0; }} //если уровень меньше 0, то оставаться на 0. // КОНЕЦ ОБРАБОТКИ НАЖАТИЯ КЛАВИШ ВВЕРХ/ВНИЗ. //================================================================================================= } //---------------------------------------------------------------------------------------------------------------------------------
Вкладка Read_LCD
void privetstvie() { // Вывод приветствия на экран при включении контроллера. lcd.setCursor(0, 0); lcd.print( " ---TEMPcontrol---" ); // ---TEMPcontrol--- // lcd.setCursor(0, 2); // *DATE: 08.08.1976* // lcd.print("DATE: "); // *TIME: 22:08:54 * // lcd.print(rtc.getDateStr()); // lcd.setCursor(0, 3); // lcd.print("TIME: "); // lcd.print(rtc.getTimeStr()); lcd.setCursor(16, 3); lcd.print( "v2.0" ); delay (2000); // Конец вывода приветствия+задержка. } //---------------------------------------------------------------------------------------------------------------------------- void Ekran() { //================================================================================================= // НАЧАЛО ОБРАБОТКИ ВЫБОРА ОТОБРАЖАЕМОГО ЭКРАНА В ЗАВИСИМОСТИ ОТ ПЕРЕМЕННОЙ "m" if (m==0){ ekran = 0; } if (m==1){ ekran = 1; } if (m==2){ ekran = 2; } // КОНЕЦ ОБРАБОТКИ ВЫБОРА ОТОБРАЖАЕМОГО ЭКРАНА В ЗАВИСИМОСТИ ОТ ПЕРЕМЕННОЙ "m" //================================================================================================= } //----------------------------------------------------------------------------------------------------------------------------- void Read_ekran() { if (ekran==0) //переменная ekran=0 (+), главный экран. { //отображаем lcd.setCursor(0, 0); lcd.print("Tul:"); lcd.print(t1, 0); lcd.print("C"); lcd.setCursor(9, 0); lcd.print("|Tp1:"); lcd.print(t2, 0); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("Pul:"); lcd.print(h1, 0); lcd.print("%"); lcd.setCursor(9, 1); lcd.print("|Pp1:"); lcd.print(h2, 0); lcd.print("%"); lcd.setCursor(0, 2); lcd.print("Vul:"); lcd.print(v1, 0); lcd.print("mm"); lcd.setCursor(9, 2); lcd.print("|"); lcd.setCursor(12, 2); lcd.print(rtc.getTimeStr()); lcd.setCursor(9, 3); lcd.print("|"); lcd.setCursor(10, 3); lcd.print(rtc.getDateStr()); } else if (ekran==1) //переменная ekran=1 (-), экран 1 { //отображаем lcd.setCursor(0, 0); //******************* lcd.print("Tgar|Vgar|"); //*Tgar|Vgar| * lcd.setCursor(0, 1); //*30C |99% | * lcd.print(t1, 0); //******************* } else if (ekran==2) //переменная ekran=2 (-), экран 2 { //отображаем lcd.setCursor(0, 0); //******************* lcd.print("Tgar|Vgar|"); //*Tgar|Vgar| * lcd.setCursor(0, 1); //*30C |99% | * lcd.print(t1, 0); //******************* lcd.print("C"); lcd.setCursor(4, 1); lcd.print("|"); lcd.print(t1, 0); lcd.print("%"); lcd.setCursor(9, 1); lcd.print("|"); } }
Вкладка Read_sensor
void read_sensor_bmp085() { dps.getPressure(&Pressure); dps.getAltitude(&Altitude); dps.getTemperature(&Temperature); } //----------------------------------------------------------------------------------------------------------------------------------- void read_sensor_dht22() { float h1 = dht.readHumidity(); //переменная h1 для датчика 1 температуры-влажности. float t1 = dht.readTemperature(); //переменная t1 для датчика 1 температуры-влажности. } //-----------------------------------------------------------------------------------------------------------------------------------
Вкладка Read_Serial
void read_sdcard() { //================================================================================================= // НАЧАЛО РАБОТЫ ОПРЕДЕЛЕНИЯ SD-карты и вывода информации о ней в сериал Serial.print("\nInitializing SD card..."); pinMode(53, OUTPUT); // выберите пин53 для Меги, пин4 для Ethernet Shield, пин10 для лругих плат. if (!card.init(SPI_HALF_SPEED, chipSelect)) { Serial.println("initialization failed. Things to check:"); Serial.println("* is a card is inserted?"); Serial.println("* Is your wiring correct?"); Serial.println("* did you change the chipSelect pin to match your shield or module?"); return; } else { Serial.println("Wiring is correct and a card is present."); } // print the type of card Serial.print("\nCard type: "); switch(card.type()) { case SD_CARD_TYPE_SD1: Serial.println("SD1"); break; case SD_CARD_TYPE_SD2: Serial.println("SD2"); break; case SD_CARD_TYPE_SDHC: Serial.println("SDHC"); break; default: Serial.println("Unknown"); } // определение файловой системы FAT16 или FAT32 if (!volume.init(card)) { Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card"); return; } // вывод типа файловой системы uint32_t volumesize; Serial.print("\nVolume type is FAT"); Serial.println(volume.fatType(), DEC); Serial.println(); volumesize = volume.blocksPerCluster(); // количество блоков volumesize *= volume.clusterCount(); //количество кластеров volumesize *= 512; //обьем карты в мегабайтах. Serial.print("Volume size (bytes): "); Serial.println(volumesize); Serial.print("Volume size (Kbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.print("Volume size (Mbytes): "); volumesize /= 1024; Serial.println(volumesize); Serial.println("\nFiles found on the card (name, date and size in bytes): "); root.openRoot(volume); // вывод списка файлов на карте root.ls(LS_R | LS_DATE | LS_SIZE); // КОНЕЦ РАБОТЫ ОПРЕДЕЛЕНИЯ SD-карты и вывода информации о ней в сериал //================================================================================================= } //----------------------------------------------------------------------------------------------------------------------------- void print_serial() { Serial.print(" Alt(m):"); Serial.print(Altitude/100); Serial.println(); Serial.print(" Pressure(mm Hg):"); Serial.print(Pressure/133.3); Serial.print(" Temp:"); Serial.print(Temperature*0.1); }
Единственная проблема во всем этом разделении в том, что данные с датчиков DHT22 (t1/h1)не отображаются на дисплее, но в сериале они видны.