Запись и чтение EEPROM переменных типа float, unsigned long, long, unsigned int, int

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да, спасибо

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ворота пишет:

brokly пишет:

использование бэкспейса в маяках 

Вопрос деда был не про маяки, а "ваще". А так, да, забой - восемь точек. 

Я не радист :) Еклмн... слово то какое... В любом случае, этот знак нужен только плохому радисту :) 

Дед ! Тебе бекспейс нужен ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я спрашивал, чтоб убедиться, что код знака в байт влезет. И оно так и есть. Цифры, буквы и пунктуация точно влезуть, а остальное от лукавава

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

DetSimen пишет:

Нет.

Вооо... Значит Дед хороший радист ! 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я помню, что при ошибке передачи передавали 5 "Е". А не 8 точек. И группу передавали сначала

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Но при желании можно и бэкспейс в восемь бит упихнуть. Только вот эта вот экономия 25 байт флеша, она страннее чем delay...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да по большому счету, маяк ничем больше заниматься и не обязан, ему и delay нихрена не повредит. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Помницца у нас один деятель на "Утёсе" морзянку отстукивал, ото музыка была. На несколько километров беспроводная передача шла :))) Так радисты даже говорили, что и вправду что-то разумное получалось - они мол типа могли принять. Не, знаю, мож брехали.

Green
Offline
Зарегистрирован: 01.10.2015

Ворота пишет:

...они мол типа могли принять.


И ведь наверняка приняли.)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ворота пишет:

Помницца у нас один деятель на "Утёсе" морзянку отстукивал, ото музыка была. На несколько километров беспроводная передача шла :))) Так радисты даже говорили, что и вправду что-то разумное получалось - они мол типа могли принять. Не, знаю, мож брехали.

Ну эта знатный извращенец ! Одно нажатие на курок тыщи полтроты поди, рублеф. Одна буква в среднем десять тыщ. Это ему в "Ищу исполнителя" !

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Хрен их связистов разберёт, чего они там принимали. Кто-то из них как-то вякнул, что при ленте в 50 патронов, серьёзного сообщения не передашь, на что пулемётчики резонно заметили, что сообщения от "Утёса" - это всегда серьёзно (не какой-нибудь сраный РПК), а краткость - сестра таланта.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ворота пишет:
Помницца у нас один деятель на "Утёсе" морзянку отстукивал, ото музыка была.
Главное под такую передачу не нарваться. А то медицина давно уже не бесплатная.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Дык тут и платная слабо поможет :( Что приемнику, что передатчику....

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

qwone пишет:
Главное под такую передачу не нарваться. А то медицина давно уже не бесплатная.
Это да. Есть правда один плюс, при таком калибре, там уж скорее всего пофиг платная она или нет :)

Хотя, прецедент был. Тем же самым калибром, только из авиационного пулемёта, японскому лётчику во время ВМВ прилетело - снесло полчерепа. Так выжил, ему сделали протез, типа колпак, чтобы мозги не пылились и он умудрился с этим протезом черепа вернуться в авиацию, воевал до конца войны и ещё довольно долго прожил после войны. Бывает же, блин!

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это получается, что ему только оставшаяся половина то и нужна была :( Сколько ресурсов в человеке не освоено.... А елси бы он целым мозгом думал... От было бы круто !

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, я точно не знаю, мож ему только черепушку сорвало, а мозги целыми остались. Не знаю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ворота пишет:

brokly пишет:

использование бэкспейса в маяках 

Вопрос деда был не про маяки, а "ваще". А так, да, забой - восемь точек. 

обычно 6 достаточно )) по две три группы

Во как тема оживилась, а начиналось то с того, что в епром шить/читать целую структуру можно одной командой

Gexogyan
Offline
Зарегистрирован: 13.01.2020

подскажите, что не так?

ругается на 8-10 строки.

'EEPROM_float_read' was not declared in this scope

#include <Wire.h>
#include "HX711.h"
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale(A1, A0);

float weight1 = EEPROM_float_read(0);
float weight2 = EEPROM_float_read(4);
float weight3 = EEPROM_float_read(8);

float calibration_factor = -337;
float units;
float ounces;

int regim = 1;
int flagRegim = 0;

int regimWork = 1;
int flagWork = 0;

int regimSettings = 1;
int flagSettings = 0;

float realWeight;
float requestedWeight;

int writePlace;

float numbA;
float numbB;
float numbC;
float numbD;

int butL = 4;
int butC = 3;
int butR = 2;

char printRegim;
float printWeight;

int led = 10;

void setup() {
  Serial.begin(9600);


  scale.set_scale();
  scale.tare();
  scale.set_scale(calibration_factor);
  lcd.init();
  lcd.backlight();
  pinMode (led, OUTPUT);
}

void loop() {
  Serial.print("Reading: ");
  units = scale.get_units();
  realWeight = units * 0.035274;
  requestedWeight = numbA + numbB + numbC / 10 + numbD / 100;

  //------- отображение названия режима --------
  lcd.setCursor(0, 0);
  lcd.print(printRegim);
  lcd.setCursor(1, 0);
  lcd.print("-");
  lcd.setCursor(2, 0);
  lcd.print(printWeight, 2);
  //------------ отображение необходимого веса ----------
  lcd.setCursor(10, 0);
  if (numbA = 0) {
    lcd.print("0");
    lcd.setCursor(11, 0);
    lcd.print(printWeight, 2);
  } else {
    lcd.print(printWeight, 2);
  }


  //----------- переглючение режимов "Работа (regim1)" и "Настройки(regim2_"
  if (digitalRead(butC) == HIGH && flagRegim == 0) {
    regim = regim + 1;
    flagRegim = 1;
    if (regim > 2) {
      regim = 1;
    }
  }
  if (digitalRead(butC) == LOW && flagRegim == 1) {
    flagRegim = 0;
  }

  //---------- Условия режимов  ------------
  if (regim == 1) {
    lcd.setCursor(6, 1);
    if (realWeight < 0.05) {
      lcd.print("00.00");
    } else {
      lcd.print(realWeight, 2);
    }
    printRegim = "W";
    work();
  }
  if (regim == 2) {
    printRegim = "S";
    settings();
  }
}
//---------- Установка подрежима "Работа" ------------
float work() {
  if (digitalRead(butL) == HIGH && flagWork == 0) {
    regimWork = regimWork + 1;
    flagWork = 1;
    if (regimWork > 3) {
      regimWork = 1;
    }
  }
  if (digitalRead(butL) == LOW && flagWork == 1) {
    flagWork = 0;
  }

  // ------------- Режим Work1 ---------------
  if (regimWork == 1) {
    requestedWeight = weight1;
    printWeight = 1;
  }
  if (regimWork == 2) {
    requestedWeight = weight2;
    printWeight = 2;
  }
  if (regimWork == 3) {
    requestedWeight = weight3;
    printWeight = 3;
  }
  if (digitalRead(butR) == HIGH) {
    workOn();
  }
  if ((realWeight) >= (requestedWeight - 2)) {
    workOff();
  }
}

// ----------------- режим Settings --------------------
float settings() {
  // ----------------- переключение цифр ---------------
  if (digitalRead(butL) == HIGH && flagSettings == 0) {
    regimSettings = regimSettings + 1;
    flagSettings = 1;
    if (regimSettings > 4) {
      regimSettings = 1;
    }
  }
  if (digitalRead(butL) == LOW && flagSettings == 1) {
    flagSettings = 0;
  }
  // ---------------- условия подрежимов Settings --------------
  if (regimSettings == 1) {
    countOn1();
  }

  if (regimSettings == 2) {
    countOn2();
  }

  if (regimSettings == 3) {
    countOn3();
  }

  if (regimSettings == 4) {
    countOn4();
    if (regimWork == 1) {
      writePlace = 0);
    }
    if (regimWork == 2) {
      writePlace = 4);
    }
    if (regimWork == 3) {
      writePlace = 8);
    }
    if (digitalRead(butL) == HIGH) {
      EEPROM_float_write(writePlace, requestedWeight);
      delay(500);
      regim = 1;
    }
  }

  // ------------------ вкл / выкл помпы ----------------
  void workOn() {
    digitalWrite(led, HIGH); // включается диод и помпа
  }
  void workOff() {
    digitalWrite(led, LOW);  // выключается диод и помпа
  }

  // ---------------- запись requestedWeight (numb) ------
  float countOn1() {
    if (digitalRead (butR) == HIGH && numbA < 90) {
      numbA = numbA + 10;
      delay(300);
    }
    if (digitalRead(butR) == HIGH && numbA == 90) {
      numbA = 0;
      delay(300);
      lcd.clear();
    }
  }

  float countOn2() {
    if (digitalRead (butR) == HIGH && numbB < 9) {
      numbB = numbB + 1;
      delay(300);
    }
    if (digitalRead(butR) == HIGH && numbB == 9) {
      numbB = 0;
      delay(300);
      lcd.clear();
    }

    float countOn3() {
      if (digitalRead (butR) == HIGH && numbC < 9) {
        numbC = numbC + 1;
        delay(300);
      }
      if (digitalRead(butR) == HIGH && numbC == 9) {
        numbC = 0;
        delay(300);
        lcd.clear();
      }
    }

    float countOn4() {
      if (digitalRead (butR) == HIGH && numbD < 9) {
        numbD = numbD + 1;
        delay(300);
      }
      if (digitalRead(butR) == HIGH && numbD == 9) {
        numbD = 0;
        delay(300);
        lcd.clear();
      }
    }

    // ---------------- запись и чтение в EEPROM --------------
    // чтение
    float EEPROM_float_read(int addr) {
      byte raw[4];
      for (byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr + i);
      float &num = (float&)raw;
      return num;
    }
    // запись
    void EEPROM_float_write(int addr, float num) {
      byte raw[4];
      (float&)raw = num;
      for (byte i = 0; i < 4; i++) EEPROM.write(addr + i, raw[i]);
    }

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Gexogyan пишет:

подскажите, что не так?

ругается на 8-10 строки.

'EEPROM_float_read' was not declared in this scope

в стандартном С функции должны быть описаны до первого использования.

 

ЗЫ Непонятно, зачем они нужны вообще, стандартные ардуиновские EEPROM.put EEPROM.get умеют работать с флоат

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Gexogyan

/*это можно оставить на прежнем месте*/
float weight1 ;
float weight2 ;
float weight3 ;

/* а вот это надо поместить в setup*/
weight1 = EEPROM_float_read(0);
weight2 = EEPROM_float_read(4);
weight3 = EEPROM_float_read(8);

А по нормальному, то прокладку которая написала скетч, надо срочно поменять. А то еще где-то дерьмо побьет.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

В общем, начал все заново писать, все заработало. Видимо где-то либо скобку пропустил, либо еще какая-то мелоч. Но тем не менее, спасибо за ответ!

b707
Offline
Зарегистрирован: 26.05.2017

Gexogyan пишет:

В общем, начал все заново писать, все заработало.

Винду не забыли переставить? Чтобы уж наверняка...

Gexogyan
Offline
Зарегистрирован: 13.01.2020

qwone пишет:

А по нормальному, то прокладку которая написала скетч, надо срочно поменять. А то еще где-то дерьмо побьет.

Этот скетч писал я - человек, который еще 10 дней назад не знал что такое микроконтроллеры и принцип их действия. 

То что написал - мне нравится. По одной простой причине - то устройство, которым управляет микроконтроллер, в итоге работает так как мне было необходимо.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

b707 пишет:

Винду не забыли переставить? Чтобы уж наверняка...

 

Ну ладно, не издевайся. У меня опыт в ардуино и С++ меньше 10 дней

b707
Offline
Зарегистрирован: 26.05.2017

Gexogyan пишет:

Ну ладно, не издевайся. У меня опыт в ардуино и С++ меньше 10 дней

так ведь сразу два человека ответили, как поправить ошибку, не переписывая код заново.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

b707 пишет:

так ведь сразу два человека ответили, как поправить ошибку, не переписывая код заново.

Да я не понял нифига, а надоедать не стал)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Gexogyan пишет:

Ну ладно, не издевайся. У меня опыт в ардуино и С++ меньше 10 дней

Бывает, чо.  У всех так было...

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

Gexogyan пишет:

Да я не понял нифига, а надоедать не стал)

И молодец! Зато переписал сам и у самого заработало - это самое важное.

Gexogyan
Offline
Зарегистрирован: 13.01.2020

ЕвгенийП пишет:

И молодец! Зато переписал сам и у самого заработало - это самое важное.

Спасибо!

Да, и удовольствие в таком случае получаешь куда больше!