Помогите объединить два скетча
- Войдите на сайт для отправки комментариев
Ср, 15/05/2013 - 14:39
Есть рабочий скетч автомобильного расходомера
#include <EEPROM.h> #include <LiquidCrystal.h> #define LCD_RS_PIN 12 #define LCD_ENABLE_PIN 11 #define LCD_D4_PIN 5 #define LCD_D5_PIN 4 #define LCD_D6_PIN 3 #define LCD_D7_PIN 2 #define LED_PIN 13 // Вывод со светодиодом //#define BANDAP_PIN 10 // Эталонный вход АЦП #define RESET_GLOBAL_PIN 6 // Номер ноги для кнопки сброса расхода #define SPEED_PIN 7 // Номер ноги для датчика скорости #define INJECTOR_PIN 8 // Номер ноги для форсунки #define CHECK_VOLTAGE_PIN A1 // Номер ноги, на которой измеряем напряжение для засекания отключения питания #define CHECK_GABARIT_PIN 14 //Номер ноги, на которой изменяется напряжение при включении габаритов ******************************** #define DISP_PIN 9 //Номер ноги подключенный через конденсатор к подсветке дисплея ************************************************* #define PERIOD 1000000 // Период усреднения текущего расхода и обновления дисплея (микросекунды) - секунда //#define BANDAP_VOLTAGE 1.1 // Эталонное напряжение на 14 входе АЦП #define CRITICAL_VOLTAGE 3.0 // Напряжение, при котором начинаем быстренько записывать в EEPROM #define IDLE_STROKE_DURATION 20000 // Суммарное время открытия форсунок (милисекунды) за период на холостом ходу #define IDLE_STROKE_HOUR_CONSUMPTION 0.7 // Часовой расход топлива на холостом ходу (литры в час) #define TEST_SPEED 60.0 // Контрольная скорость (километры в час) для расчёта коэффициента пробега #define TEST_TICKS 84 // Число импульсов с датчика скорости за период на контрольной скорости #define HOUR_PERIODS ( 3600000000.0 / PERIOD ) // Число периодов в часу #define FUEL_FACTOR ( IDLE_STROKE_HOUR_CONSUMPTION / HOUR_PERIODS / IDLE_STROKE_DURATION ) // Коэффициент расхода топлива (литры) за период #define RANGE_FACTOR ( TEST_SPEED / TEST_TICKS / HOUR_PERIODS ) // Коэффициент пробега (километры) за период #define CONSUMPTION_FACTOR ( 100.0 * FUEL_FACTOR / RANGE_FACTOR ) // Коэффициент километрового расхода топлива (литры на 100 км) #define TICKS_TRESHOLD 1 // Порог (импульсы датчика скорости) за период, выше которого можно считать километровый расход #define DURATION_CORR 0 // Поправка при измерении длительности времени открытия одной форсунки (микросекунды) #define AVG_LENGTH 10 // Число периодов для усреднения #define AVG_REFRESH_TIME 1 // Время в часах, после которого сбрасывается усреднённый километровый расход, если не было сброса по расстоянию (1 час) #define AVG_REFRESH_LENGTH 0.1 // Расстояние в километрах, после которого сбрасывается усреднённый километровый расход (100 м) // #define AVG_REFRESH_PERIODS ( AVG_REFRESH_TIME * HOUR_PERIODS ) // Число периодов между обновлениями среднего расхода #define AVG_REFRESH_PERIODS 60 // Число периодов между обновлениями среднего расхода #define AVG_REFRESH_TICKS ( AVG_REFRESH_LENGTH / RANGE_FACTOR ) // Число импульсов датчика скорости между обновлениями среднего расхода #define SHOW_GLOBAL_PERIODS 3 // Число периодов между переключениями общего и среднего (за 10 минут) расхода // Строковые константы // #define STR_AVG String(" Cp:") // #define STR_CUR String("M\0:") // #define STR_HR String("1:") #define STR_AVG String("AVG:") #define STR_CUR String("CUR:") #define STR_HR String("HR:") #define STR_GLOB String("GL:") #define STR_NA String(" n/a") #define STR_KMH String("km/h") LiquidCrystal lcd(LCD_RS_PIN, LCD_ENABLE_PIN, LCD_D4_PIN, LCD_D5_PIN, LCD_D6_PIN, LCD_D7_PIN); int GabaritState = 0; //Переменная для хранения состояния габаритов ************************************************** unsigned long dur; unsigned long dur_t; unsigned long t; boolean last_injector_state; boolean last_speed_state; boolean last_reset_global_state; unsigned long total_duration; unsigned long total_ticks; unsigned long total_avg_duration; unsigned long total_avg_ticks; unsigned long d_avg_duration; unsigned long d_avg_ticks; unsigned long global_avg_duration; unsigned long global_avg_ticks; int period_counter; // int period_counter2; boolean eeprom_already_written; boolean show_global; int show_global_counter; // Структура, описывающая данные для усреднения struct consumption_data { unsigned long duration; unsigned long ticks; }; byte gauge_0[] = { B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B11111111 }; byte gauge_1[] = { B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B11111111, B11111111 }; byte gauge_2[] = { B00000000, B00000000, B00000000, B00000000, B00000000, B11111111, B11111111, B11111111 }; byte gauge_3[] = { B00000000, B00000000, B00000000, B00000000, B11111111, B11111111, B11111111, B11111111 }; byte gauge_4[] = { B00000000, B00000000, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111 }; byte gauge_5[] = { B00000000, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111 }; byte gauge_6[] = { B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111 }; byte gauge_7[] = { B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111 }; struct consumption_data data[AVG_LENGTH]; int avg_counter; void setup() { { // инициализируем пин, подключенный к подсветке, как выход ****************************************** pinMode(DISP_PIN, OUTPUT); // инициализируем пин, подключенный к габаритам, как вход******************************************** pinMode(CHECK_GABARIT_PIN, INPUT); } //Serial.begin(9600); pinMode(9, OUTPUT); //Выход на габариты analogWrite(9, 150); // устанавливаем ШИМ выход // Инициализация дисплея lcd.begin(16, 2); // Загрузка пользовательских символов для отрисовки шкалы lcd.createChar(0, gauge_0); lcd.createChar(1, gauge_1); lcd.createChar(2, gauge_2); lcd.createChar(3, gauge_3); lcd.createChar(4, gauge_4); lcd.createChar(5, gauge_5); lcd.createChar(6, gauge_6); lcd.createChar(7, gauge_7); pinMode(INJECTOR_PIN, INPUT); pinMode(SPEED_PIN, INPUT); pinMode(RESET_GLOBAL_PIN, INPUT); pinMode(CHECK_VOLTAGE_PIN, INPUT); pinMode(LED_PIN, OUTPUT); digitalWrite(SPEED_PIN, HIGH); digitalWrite(INJECTOR_PIN, HIGH); digitalWrite(RESET_GLOBAL_PIN, LOW); //last_injector_state = analogRead(INJECTOR_PIN) < 500; //last_speed_state = analogRead(SPEED_PIN) < 500; last_reset_global_state = digitalRead(RESET_GLOBAL_PIN); // Инициализация данных для усреднения for (int i=0; i < AVG_LENGTH; ++i) { data[i].duration = 0; data[i].ticks = 0; } dur = 0; dur_t = micros(); t = dur_t + PERIOD; total_duration = 0; total_ticks = 0; total_avg_duration = total_duration; total_avg_ticks = total_ticks; d_avg_duration = total_duration; d_avg_ticks = total_ticks; for (int i = 0; i < sizeof(unsigned long int); ++i) { *( (byte*)(&global_avg_duration) + i ) = EEPROM.read(i); } int addr = sizeof(unsigned long int); for (int i = 0; i < sizeof(unsigned long int); ++i) { *( (byte*)(&global_avg_ticks) + i ) = EEPROM.read(addr + i); } /* global_avg_duration = 0; global_avg_ticks = 0; */ period_counter = 0; // period_counter2 = 0; avg_counter = 0; show_global = false; show_global_counter = 0; eeprom_already_written = true; } void loop() { float realv = (5.0 / 1024.0 * analogRead(2))*19; //+++++++++++++++++++++++++++++++++++++++++++++++++++++ GabaritState = digitalRead(CHECK_GABARIT_PIN); //************************************************** // проверяем вкличены габариты // если вкличены, то buttonState будет HIGH: if (GabaritState == HIGH) { // включаем подсветку analogWrite(DISP_PIN, 135); // устанавливаем ШИМ выход } else { // выключаем подсветку analogWrite(DISP_PIN, 155); // устанавливаем ШИМ выход ******************************************* } // float vcc_voltage = BANDAP_VOLTAGE * 1024 / analogRead(BANDAP_PIN); float check_voltage = 5.0 * analogRead(CHECK_VOLTAGE_PIN) / 1024; /* boolean injector_state = analogRead(INJECTOR_PIN) < 500; boolean speed_state = analogRead(SPEED_PIN) < 500;*/ boolean injector_state = !digitalRead(INJECTOR_PIN); boolean speed_state = digitalRead(SPEED_PIN); boolean reset_global_state = digitalRead(RESET_GLOBAL_PIN); unsigned long new_t = micros(); // if (vcc_voltage < CRITICAL_VOLTAGE) { if (check_voltage < CRITICAL_VOLTAGE) { if (!eeprom_already_written) { digitalWrite(LED_PIN, HIGH); // Быстренько записываем в ПЗУ данные о среднем расходе for ( int i = 0; i < sizeof(unsigned long int); ++i ) { EEPROM.write(i, *( (byte*)(&global_avg_duration) + i) ); } int addr = sizeof(unsigned long int); for ( int i = 0; i < sizeof(unsigned long int); ++i ) { EEPROM.write(addr + i, *( (byte*)(&global_avg_ticks) + i) ); } eeprom_already_written = true; digitalWrite(LED_PIN, LOW); } } else { eeprom_already_written = false; } // Вычисление мгновенных значений if (injector_state != last_injector_state) { if (injector_state) { dur = new_t - dur_t; if (dur) dur += DURATION_CORR; // Поправочка total_duration += dur; } else { dur_t = new_t; dur = 0; } last_injector_state = injector_state; } if (speed_state != last_speed_state) { total_ticks++; last_speed_state = speed_state; } if (last_reset_global_state == HIGH && reset_global_state == LOW) { global_avg_duration = 0; global_avg_ticks = 0; digitalWrite(LED_PIN, HIGH); } if (last_reset_global_state == LOW && reset_global_state == HIGH) { digitalWrite(LED_PIN, LOW); } last_reset_global_state = reset_global_state; // Действия, которые выполняются раз в секунду if (new_t >= t) { if (!dur) { dur = new_t - dur_t; if (dur) dur += DURATION_CORR; // Поправочка total_duration += dur; } // Отладочная установка значений // total_duration = 100000; //ПРИ ЗАПУСКЕ ЗАКОМЕНТИРОВАТЬ //total_ticks = 56; d_avg_duration += total_duration; d_avg_ticks += total_ticks; global_avg_duration += total_duration / 1000; global_avg_ticks += total_ticks; ++period_counter; // ++period_counter2; // if (d_avg_ticks >= AVG_REFRESH_TICKS || period_counter >= AVG_REFRESH_PERIODS) { if (period_counter >= AVG_REFRESH_PERIODS) { // Вычисление средних значений total_avg_duration += d_avg_duration; total_avg_duration -= data[avg_counter].duration; total_avg_ticks += d_avg_ticks; total_avg_ticks -= data[avg_counter].ticks; data[avg_counter].duration = d_avg_duration; data[avg_counter].ticks = d_avg_ticks; // total_avg_duration = 0; // total_avg_ticks = 0; // for (int i = 0; i < AVG_LENGTH; ++i) { // total_avg_duration += data[i].duration; // total_avg_ticks += data[i].ticks; // } // Отладочный вывод //Serial.println(total_duration, DEC); //Serial.println(total_ticks, DEC); //Serial.println(d_avg_duration, DEC); //Serial.println(d_avg_ticks, DEC); // Serial.println(total_avg_duration, DEC); // Serial.println(total_avg_ticks, DEC); period_counter = 0; d_avg_duration = 0; d_avg_ticks = 0; ++avg_counter; if (avg_counter >= AVG_LENGTH) avg_counter = 0; } // Конвертация значений в физические единицы и вывод на экран String s1, s2, s3, s4; unsigned int consumption = 0; unsigned int avg_consumption = 0; unsigned int global_avg_consumption = 0; if (total_ticks > TICKS_TRESHOLD) { consumption = 10.0 * CONSUMPTION_FACTOR * total_duration / total_ticks; } if (total_avg_ticks > TICKS_TRESHOLD) { avg_consumption = 10.0 * CONSUMPTION_FACTOR * total_avg_duration / total_avg_ticks; } if (global_avg_ticks > TICKS_TRESHOLD) { global_avg_consumption = 10000.0 * CONSUMPTION_FACTOR * global_avg_duration / global_avg_ticks; } unsigned int hour_consumption = 10.0 * FUEL_FACTOR * total_duration * HOUR_PERIODS; unsigned int spd = RANGE_FACTOR * total_ticks * HOUR_PERIODS; s1 = String(total_duration, DEC); if (total_ticks > TICKS_TRESHOLD) { s1 = STR_CUR + format(consumption); // s1 = STR_HR + format(hour_consumption); // s1 = format(consumption); } else { // s1 = STR_CUR + STR_NA; // s1 = STR_HR + STR_NA; // s1 = "n/a "; s1 = STR_HR + format(hour_consumption); } if (total_avg_ticks > TICKS_TRESHOLD) { s2 = STR_AVG + format(avg_consumption); // s2 = STR_KM + format(avg_consumption); // s2 = format(avg_consumption); } else { s2 = STR_AVG + STR_NA; // s2 = STR_KM + STR_NA; // s2 = "n/a "; } if (global_avg_ticks > TICKS_TRESHOLD) { s4 = STR_GLOB + format(global_avg_consumption); } else { s4 = STR_GLOB + STR_NA; } byte gauge_level = round(float(hour_consumption) / 10.0); byte c1; byte c2; if (gauge_level > 8) { c1 = 7; c2 = gauge_level - 9; if (c2 > 7) c2 = 7; } else if (gauge_level > 0) { c1 = gauge_level - 1; c2 = ' '; } else { c1 = ' '; c2 = ' '; } // s2 = "hr: " + format(hour_consumption); // s2 = format(hour_consumption); // s3 = "sp: " + String(spd, DEC); // s3 = String(spd, DEC); // s3 = String(total_ticks, DEC); // int iters = 3 - s3.length(); // int iters = 8 - s3.length(); // for(int i = 0; i < iters; ++i) // s3 = " " + s3; // int iters2 = 8 - s1.length(); // for(int i = 0; i < iters2; ++i) // s1 = " " + s1; lcd.setCursor(11, 1); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lcd.print(realv); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lcd.print("V"); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //s3 += STR_KMH; lcd.setCursor(1,0); lcd.print( show_global ? s4 : s2 ); if (show_global_counter > SHOW_GLOBAL_PERIODS) { show_global = !show_global; show_global_counter = 0; } show_global_counter++; lcd.setCursor(1,1); lcd.print(s1); lcd.setCursor(0, 1); lcd.write(c1); //Заменил print ha write lcd.setCursor(0, 0); lcd.write(c2); total_duration = 0; total_ticks = 0; t = new_t + PERIOD; } } String format(unsigned int dec) { if (dec > 1000) return String("##.#"); unsigned int intPart = dec / 10; unsigned int fracPart = dec % 10; String result = String(intPart, DEC) + "," + String(fracPart, DEC); int iters = 4 - result.length(); for(int i = 0; i < iters; ++i) result = " " + result; return result; }
Хочу добавить отображение температуры за бортом
#include <LiquidCrystal.h> #include <OneWire.h> #include <EEPROM.h> byte gradus[8] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000, }; // создаем собственный символ "градус Цельсия" byte i; byte n; byte m=0; byte t=0; int T[]={0,0,0,0}; int Tp[]={0,0,0,0}; int TD[]={0,0,0,0}; byte data[9]; byte TotalDS=0; byte addr[4][8] = { {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, }; OneWire ds(10); LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); } void Menu() { lcd.clear(); lcd.createChar(1, gradus); // присваиваем символу "градус Целься" порядковый номер lcd.setCursor(11, 0); lcd.print("T1:"); lcd.print(T[0]); lcd.print("\1C"); //символ "градус Цельсия" i = 0; n=0; while (i != 1 ) { if ( ds.search(addr[n]) != 1) { ds.reset_search(); i = 1; } else { n++; TotalDS = n; } } } void Gettemp() { ds.reset(); ds.write(0xCC,1); ds.write(0x44,1); for( n = 1; n < 90; n++) { delay(10); } for( n = 0; n < 4; n++) { ds.reset(); ds.select(addr[n]); ds.write(0xBE); for ( i = 0; i < 9; i++) {data[i] = ds.read();} Tp[n] = float((data[1] << 8) + data[0])/16.0; if (Tp[n] == 85) {} else {T[n]=Tp[n];} } byte write_DS() ;{ for (i=0; i<8; i++) { if (m==0) {EEPROM.write(128+t*8+i,0);} else {EEPROM.write(128+t*8+i,addr[m-1][i]);} } } byte read_DS(); { for (n=0; n<4; n++) { for (i=0; i<8; i++) { addr[n][i] = EEPROM.read(128+n*8+i); } } } } void loop() { Menu(); Gettemp(); }
Но знаний к сожалению не хватает,помогите пожалуйста.