Нужен трезвый взгляд профи
- Войдите на сайт для отправки комментариев
Чт, 07/07/2016 - 08:23
Привет всем !
Переписал данный скетч для своей ардуины:
[code] #include <LiquidCrystal.h> #include <Wire.h> #include "SparkFunBME280.h" #include "ds3231.h" BME280 mySensor; uint8_t time[8]; unsigned int recv_size = 0; unsigned long prev, interval = 1000; int regim=1; // объявление переменной "режим" int flag=0; // объявление переменной "" int led = 13; LiquidCrystal lcd(2, 3, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); // инициализация LCD lcd.clear(); // очистка LCD Wire.begin(); // инициализация pinMode(led,OUTPUT); digitalWrite (led, LOW); DS3231_init(DS3231_INTCN); // инициализация модуля часов mySensor.settings.I2CAddress = 0x76; // инициализация BME280 mySensor.settings.runMode = 3; mySensor.settings.tStandby = 0; mySensor.settings.filter = 0; mySensor.settings.tempOverSample = 1; mySensor.settings.pressOverSample = 1; mySensor.settings.humidOverSample = 1; { lcd.print(mySensor.begin(),HEX); delay(10); } } void loop() { char tempF[6]; float temperature; delay(1000); // char in; unsigned long now = millis(); struct ts t; if ((now - prev > interval) && (Serial.available() <= 0)) { DS3231_get(&t); //Get time temperature = DS3231_get_treg(); //Get temperature dtostrf(temperature, 5, 1, tempF); //ожидание нажатия кнопки if(digitalRead(8)==HIGH&&flag==0)//если кнопка нажата // и переменная flag равна 0 , то ... { regim++; flag=1; lcd.begin(16, 2); // Очистка дисплея при нажатии кнопки if(regim>4) //ограничим количество режимов { regim=1; //так как мы используем только одну кнопку, } } if(digitalRead(8)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0; //обнуляем переменную "knopka" } if(regim==1) //первый режим { //здесь может быть любое ваше действие 1 // вывод на экран показаний даты и времени lcd.setCursor(2,0); // Дата lcd.print(t.mday); printMonth(t.mon); lcd.print((t.year)); // вывода даты lcd.setCursor(7,1); // Время lcd.print(t.hour); lcd.print(":"); if(t.min<10) { lcd.print("0"); } lcd.print(t.min); lcd.print(":"); if(t.sec<10) { lcd.print("0"); } lcd.print(t.sec); lcd.setCursor(2, 1); // установка курсора printwday(t.wday); //Вывод на экран дня недели //lcd.setCursor(14, 0); // установка курсора //lcd.print(t.wday); //Вывод на экран дня недели цифрой } } if(regim==2) //второй режим { //здесь может быть любое ваше действие 2 // Вывод на экран атмосферного давления с ВМР280 lcd.setCursor(0,0); lcd.print("Press: "); lcd.print((uint32_t)mySensor.readFloatPressure()/133.3); lcd.print(" mm "); lcd.setCursor(0,1); lcd.print("Humid: "); lcd.print((uint8_t)mySensor.readFloatHumidity()); lcd.print(" %"); } if(regim==3)//третий режим { //здесь может быть любое ваше действие 3 //Вывод на экран температуры с ВМР280 lcd.setCursor(0,0); lcd.print("BME t: "); lcd.print(mySensor.readTempC(),1); lcd.print((char)223);//вывод на экран значка "градус" lcd.print("C"); // Вывод на экран атмосферного давления с ВМР280 lcd.setCursor(0, 1); lcd.print((uint32_t)mySensor.readFloatPressure()/133.3); lcd.print(" mm "); lcd.print((uint8_t)mySensor.readFloatHumidity() ); lcd.print(" %"); } if(regim==4)//четвертый режим { //здесь может быть любое ваше действие 4 // вывод не экран температуры с модуля часов lcd.setCursor(0, 0); lcd.write( "ds3231 "); lcd.print(tempF); lcd.print((char)223); lcd.print("C"); prev = now; // Вывод на экран атмосферного давления с ВМР280 lcd.setCursor(0, 1); lcd.print((uint32_t)mySensor.readFloatPressure()/133.3); lcd.print(" mm "); lcd.print((uint8_t)mySensor.readFloatHumidity()); lcd.print(" %"); } } void printMonth(int month) { switch(month) { case 1: lcd.print(" January ");break; case 2: lcd.print(" February ");break; case 3: lcd.print(" March ");break; case 4: lcd.print(" April ");break; case 5: lcd.print(" May ");break; case 6: lcd.print(" June ");break; case 7: lcd.print(" July ");break; case 8: lcd.print(" August ");break; case 9: lcd.print(" September ");break; case 10: lcd.print(" October ");break; case 11: lcd.print(" November ");break; case 12: lcd.print(" December ");break; default: lcd.print(" Error ");break; lcd.clear(); } } void printwday(int wday) { switch(wday) { case 1: lcd.print("Mon ");break; case 2: lcd.print("Tue ");break; case 3: lcd.print("Wed ");break; case 4: lcd.print("Thu ");break; case 5: lcd.print("Fri ");break; case 6: lcd.print("Sat ");break; case 7: lcd.print("Sun ");break; default: lcd.print("Error");break; lcd.clear(); } } [/code]
Скетч работает, но при первом включении на дисплее в верхней строке слева выскакивает цыфра 60. При первом пролистовании показания датчика в режиме 2, несколько занижены. А потом при прокрутке всех режимов все нормализуется. Где -то косячек, но глаз замылился не могу рассмотреть, да и опыта еще не так много.
Подчистил чуть, чуть хвосты - убрал 51 строку и 53, 161. Но косяк остался. Наверное нужно еще и строку 12, 13 убрать.
Профи разьехались на моря.:-(
Профи разьехались на моря.:-(
турки теперь - братья
:-)
я не работал с этим сенсером, но мои DHT по началу всегда криво показывают, так что нужно наверное подождать пока прогреется. про скетч: я бы избавился от delay, см. blink without delay. Строку 60 он пишет в 39 строке lcd.print(mySensor.begin(),HEX);
lcd.begin(16, 2);
// Очистка дисплея при нажатии кнопки
не очистка а старт, нужен только в сетапе, потом при необходимости очистки пишем lcd.cleare(); если остальное работает и ладно...: я бы избавился от delay, см. blink without delay. Строку 60 он пишет в 39 строке lcd.print(mySensor.begin(),HEX); lcd.begin(16, 2); // Очистка дисплея при нажатии кнопки не очистка а старт, нужен только в сетапе, потом при необходимости очистки пишем lcd.cleare(); если остальное работает и ладно...
Что-то я не понял, можно это как-то наглядней показать?
Наглядно
Наглядно
Если смотреть отдельно от скетча, то понятно как бы, а вот как это в скетч вписать не хватает пока понятия. :-(
Наглядно
Если смотреть отдельно от скетча, то понятно как бы, а вот как это в скетч вписать не хватает пока понятия. :-(
все через это проходили. так что не опускайте руки, я Вам напишу сейчас только без delay(), остальное сами со временем додумаете. Если продолжите заниматься ардуино через полгодика почитаете этот скетч, поймете как тут все легко).попробуйте, я проверять не стал, нет возможности на работе, может со скобками что и напутал. Да и фокус с Вашей структурой я что то не понял. вообщем если будет ругаться пишите...
Спасибо за помощь, скетч кампилируется, но режимы прыгают с одного на другой, вообщем пока нужно разбираться.
Итак, давай по порядку. Наченем с того что я не работал с данным дисплеем, по этому не могу сказать что делает строки 081 и 133 display.display(); может и ничего. Во вторых я тебе уже убирал очистку дисплея после написаний месяца, дня недели и после написания влажности итд. ты их зачем то поставил обратно (твои строчки 126, 157, 173). Довольно таки недальновидно писать что то и затем сразу это стирать, поскольку удаленный наблюдатель не успеет это прочесть (если он конечно не белка). Так, идем дальше. Чтобы понять как будет работать программа нужно думать как микропроцессор. Продумывать нужно последовательно сверху вниз, либо по изменениям переменных. Для этого очень помогают комментарии в коде, коими твой код не блещет. Давай смотреть что происходит с переменной режим по всему циклу: итак, мы включаем нашу пространственно-временную метеостанцию и что происходит? создаются переменные, в сетапе все инициируется, потом начинаются луп и начинаются приколы: мне также не понятно зачем в 052 Serial.avalible? у нас сериал не включался даже... потом я тебе скобки исправлял, ты их опять накосячил, вот режимы и прыгают. Смысл в том что в цикле 052-057 делается все то что должно делаться раз в секунду, если тебе на пример нужно чтобы что то делалось раз в 5 или скажем 10 секунд нужно ввести переменную unsigned long prev_2, int interval_2=5000 или 10000 и в этом цикле прописываем то что нам нужно. скобки {} ограничивают цикл. далее у нас идет if в с 060 и должен заканчиваться в 071, количество закрытых и открытых скобок {} должны совпадать. У тебя ошибка еще, ты "поднимаешь" флаг когда читаешь значение пина 8, а "опускаешь" когда читаешь значение пина 9. я так понимаю что это не правильно. пины "по феншую" обозначаются через counst int либо через #define, на пример с самого верха пишете #define button_pin 8 (обратите внимание на пунктуацию, точку с запятой ставить не нужно). если у вас скажем несколько цветных лампочек или пищалка также пишите все через #define led_1_pin 10 итд. теперь в тексте мы используем button_pin а компелятор вместо него подставляет везде 8. Итак, надеюсь это понятно. Теперь скобочки: стачала у нас идут "ифы" с периудами, потом "ифы" ответственные за кнопку. то есть if (кнопка нажата && флажек опущен){поднять флаг!; действия, в том числе переполнение regim(то биш if>2{regim=1}}. Затем if (кнопка отжата&& флажок поднят){опустить флаг!;} потом ифы для распечатки экранов в зависимости от режимов. Да, кстати, вы значения с датчиков печатаете сразу на экран, их бы сохранить в отдельные переменные и делать это в периодичном цыкле. что то мне показывает что делать это надо раз в 2 секунды:). Переменные обновляем в цикле с millis()-prev, из распечатки экрана убираем делай, убираем очистку(мы экран чистим при нажатии кнопки, еще нужно чистить при обновлении переменных. А переменные уже печатаем на экране. Попробуй учесть все мои замечания и все должно полететь, если что пиши...
Mr.Privet, спасибо за комментарий. С дисплеем работаю сам впервые. Почистил свой скетч от лишних -« display.clearDisplay();» и « display.display();». Оставил только там где это необходимо. Вообщем потом отпишусь. Если убиреш "display.display();" из 133 строки не печатается текст вообще, висит какая-то птичка. Особенность библиотеки с кирилицей. Если убрать из 126 стр. "display.clearDisplay();", то печать показаний барометра размазывается(возможно, потом можно будет убрать). А с пин 8 - явно напартачил.
show splashscreen