Как поменять приращение EEPROM чтобы было два знака после запятой
- Войдите на сайт для отправки комментариев
Пнд, 08/02/2016 - 10:20
// v 0.1 beta #include <DallasTemperature.h> #include <EEPROM.h> #include <OneWire.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #define ONE_WIRE_BUS 11 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); LiquidCrystal_I2C lcd(0x3F,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display #define ONE_WIRE_BUS 11 #define OUT1 2 // выходы для реле float tempOUT1; OneWire ds(11); // 11 вход датчика 18b20 byte gradus[8] = { 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000 }; byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val <10 ) return 5; else if (val <100) return 3; else if (val <400 ) return 4; else if (val <600 ) return 2; else if (val <900 ) return 1; else return 0; } //// void setMenu(){ // установка температуры byte pos; digitalWrite(OUT1, LOW); // выключаем реле lcd.setCursor(, 0); // что нужно отрисовать один раз lcd.print("OUT1: "); delay(1000); lcd.blink(); while(1){ // крутим бесконечный цикл // так было не знаю byte KEY = key(); // читаем состояние кнопок lcd.setCursor(6, 0); // выводим на экран lcd.print(tempOUT1); lcd.write(1); lcd.print("C "); ////// обработка кнопок if (pos == 0){ // если в первой позиции lcd.setCursor(10, 0); // устанавливаем курсор if (KEY == 2) { // если нажата кнопка tempOUT1--; // изменяем значение EEPROM.write(1, tempOUT1); // сохраняем в еепром } } else if (KEY == 5){ tempOUT1++; EEPROM.write(1, tempOUT1); } if (pos == 1){ lcd.setCursor(8, 0); if (KEY == 2) { } else if (KEY == 5){ } } if (KEY == 3) pos--; // крутим позицию else if (KEY == 4) pos++; if (pos > 1) pos = 1; delay(1000); } } float getTemp(){ // возвращает температуру с датчика byte data[12]; // и останавливает программу на секунду byte addr[8]; if (!ds.search(addr)) { lcd.clear(); lcd.print("No sensor."); } ds.reset_search(); if (OneWire::crc8(addr, 7) != addr[7]) { lcd.clear(); lcd.print("Sensor CRC erorr"); } ds.reset(); ds.select(addr); ds.write(0x44); delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); for (int i = 0; i < 9; i++) data[i] = ds.read(); int raw = (data[1] << 8) | data[0]; // Переводим в температуру if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6]; return raw / 16.0; } void setup() { //Serial.begin(9600); lcd.init(); // Старт дисплея lcd.backlight(); //Turns backlight on lcd.createChar(1, gradus); lcd.begin(16, 2); lcd.clear(); pinMode(13, OUTPUT); pinMode(OUT1, OUTPUT); tempOUT1 = EEPROM.read(1); // читаем настройки } void loop() { sensors.requestTemperatures(); if (key() == 1) setMenu(); // если нажата селект, уходим в меню else if (key() == 4) analogWrite(10, 20); // если вниз, глушим подсветку else if (key() == 3) digitalWrite(10, HIGH); float temperature = sensors.getTempCByIndex(0); // читаем температуру if (temperature < tempOUT1) digitalWrite(OUT1, HIGH); // сверяем температуру else digitalWrite(OUT1, LOW); // и управляем выходами lcd.setCursor(0, 0); /// вывод инфы на экран lcd.print("INKUB:"); lcd.print(tempOUT1); lcd.write(1); // lcd.print("C"); if (digitalRead(OUT1)) lcd.print(" ON "); // показываем состояние выхода else lcd.print(" OFF"); lcd.setCursor(0, 1); // показываем температуру с датчика lcd.print("DATCHIK: "); lcd.print( temperature, 1); lcd.write(1); delay(2000); }
Температуру надо менять десятыми долями
В можете более внятно объяснить свою проблему? Чтобы понятно было не только Вам? А то, боюсь, что "что такое приращение EEPROM" знаете только Вы, и никто больше :)
https://www.youtube.com/watch?v=y62Ps_D9B1M&feature=youtu.be
вот здесь в комментариях все это есть
Перевожу на человеческий. Как читать и писать float в EEPROM. Это не сложно. Но и не нужно. Т.к. нужно убрать float из програмы вообще. Заменить на word и вопрос соответственно решится.
https://www.youtube.com/watch?v=y62Ps_D9B1M&feature=youtu.be
вот здесь в комментариях все это есть
Вы что, реально думаете, что я полезу на ютуб читать комментарии, просто потому, что Вам лень объяснить, что Вам нужно? Издеваетесь? Кому из нас это надо? Мне или Вам?
Если правда, что Вам нужно записать float в EEPROM, так и пишите, кто Вам не даёт-то? Функция put зафигачит туда любой тип - ей всё равно. Вот здесь есть даже пример конкретно с float - https://www.arduino.cc/en/Reference/EEPROMPut
Извините. С ардуино я знаком неделю поэтому незнаю как объяснить
Так хоть моргните, правильно ли я понял ))) Кстати как для недели весьма нехилый проект. Поясню про float. Как для слабенького процессора этот тип данных сильно "прожорлив" много места занимает и медленно считается. Его лучше избегать. В вашем случае это не сложно. Температура с датчика выдается 2 байтами. В диапазоне от +125 до -25 (по памяти пишу) т.е. 150 значений в точности до целого. В точности до десятого будет 1500 возможных значений, что легко влазит в 2 байта. И очень даже запросто принять что значение 1 это 0,1градус, 2 -0,2градуса,.. 1234- соответствено 123,4градуса. Минус (если надо) аналогично. Два знака заведомо излишне, датчик имеет точность 0,5гредуса. Хотя в принципе аналогичный подход возможен, только принять что 1 это 0,01градус. Можно и по другому немного, но не буду забивать голову для начала.
ПС. delay тоже использовать не рекомендуется, читайте форум, тут про это много, даже сегодняшнего.
Спасибо А что насчет кнопок то что я там натворил правильно?
О, уже наблюдаем прогресс. Всегда говорил, не надо делать за кого то.
Переходим ко второй части Марлезонского балета:
1. Выкидывем все, что нами бездумно скопипищенно.
2. Начинаем изобретать Великое творение - "ИНКУБАТОР".
2.1. Берем лист бумаги и рисуем на нем, что мы от него хотим.
2.2. На следующем листе рисуем, что для наших хотелок требуется из железа.
2.3. Раскидываем железо по пинам имеющейся АТМЕГИ.
Для начала все. Если хотите сделать, начинайте с этих пунктов и возвращайтесь с результатами.