Как поменять приращение EEPROM чтобы было два знака после запятой

artur141
Offline
Зарегистрирован: 06.02.2016

//  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);
}

 

artur141
Offline
Зарегистрирован: 06.02.2016

Температуру надо менять десятыми долями

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В можете более внятно объяснить свою проблему? Чтобы понятно было не только Вам? А то, боюсь, что "что такое приращение EEPROM" знаете только Вы, и никто больше :)

artur141
Offline
Зарегистрирован: 06.02.2016

https://www.youtube.com/watch?v=y62Ps_D9B1M&feature=youtu.be

вот здесь в комментариях все это есть

Logik
Offline
Зарегистрирован: 05.08.2014

Перевожу на человеческий. Как читать и писать float в EEPROM. Это не сложно. Но и не нужно. Т.к. нужно убрать float из програмы вообще. Заменить на word и  вопрос соответственно решится.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

artur141 пишет:

https://www.youtube.com/watch?v=y62Ps_D9B1M&feature=youtu.be

вот здесь в комментариях все это есть

Вы что, реально думаете, что я полезу на ютуб читать комментарии, просто потому, что Вам лень объяснить, что Вам нужно? Издеваетесь? Кому из нас это надо? Мне или Вам? 

Если правда, что Вам нужно записать float в EEPROM, так и пишите, кто Вам не даёт-то? Функция put зафигачит туда любой тип - ей всё равно. Вот здесь есть даже пример конкретно с float - https://www.arduino.cc/en/Reference/EEPROMPut

artur141
Offline
Зарегистрирован: 06.02.2016

Извините. С ардуино я знаком неделю поэтому незнаю как объяснить

Logik
Offline
Зарегистрирован: 05.08.2014

Так хоть моргните, правильно ли я понял ))) Кстати как для недели весьма нехилый проект. Поясню про float. Как для слабенького процессора этот тип данных сильно "прожорлив" много места занимает и медленно считается. Его лучше избегать. В вашем случае это не сложно. Температура с датчика выдается 2 байтами. В диапазоне от +125 до -25 (по памяти пишу) т.е. 150 значений в точности до целого. В точности до десятого будет 1500 возможных значений, что легко влазит в 2 байта. И очень даже запросто принять что значение 1 это 0,1градус, 2  -0,2градуса,..  1234- соответствено 123,4градуса. Минус (если надо) аналогично. Два знака заведомо излишне, датчик имеет точность 0,5гредуса. Хотя в принципе аналогичный подход возможен, только принять что 1 это 0,01градус.  Можно и по другому немного, но не буду забивать голову для начала. 

ПС. delay тоже использовать не рекомендуется, читайте форум, тут про это много, даже сегодняшнего.

artur141
Offline
Зарегистрирован: 06.02.2016

Спасибо А что насчет кнопок то что я там натворил правильно?

bwn
Offline
Зарегистрирован: 25.08.2014

О, уже наблюдаем прогресс. Всегда говорил, не надо делать за кого то.
Переходим ко второй части Марлезонского балета:
1. Выкидывем все, что нами бездумно скопипищенно.
2. Начинаем изобретать Великое творение - "ИНКУБАТОР".
  2.1. Берем лист бумаги и рисуем на нем, что мы от него хотим.
  2.2. На следующем листе рисуем, что для наших хотелок требуется из железа.
  2.3. Раскидываем железо по пинам имеющейся АТМЕГИ.
         Для начала все. Если хотите сделать, начинайте с этих пунктов и возвращайтесь с результатами.