Поделить число, и записать его в EEPROM.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Необходимо поделить 7-ми значное число на отдельные цифры и записать их для хранения. Также необходима возможность сложить данные цифры в 7-ми значное число обратно. Как-то так :)

MagicianT
Offline
Зарегистрирован: 03.10.2015

А  put() не пробовали?

https://www.arduino.cc/en/Reference/EEPROMPut

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

А пояснить не можете? Просто не очень английский знаю.

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

Nazar_Diadiun пишет:

Необходимо поделить 7-ми значное число на отдельные цифры и записать их для хранения. Также необходима возможность сложить данные цифры в 7-ми значное число обратно. Как-то так :)

В посте нет никакого вопроса и/или просьбы. Есть только утверждение. Так что отвечать особо не на что.

Если бы это всё-таки был вопрос, типа "как это сделать", то здесь явно не хватает пояснения в каком типе данных (представлении) оное число находится.

MagicianT
Offline
Зарегистрирован: 03.10.2015

Дак там же пример есть. А С/C++ он весь на английском. Я так понимаю, что на цифры делите потому что в ЕЕПРОМ байты надо писать? Когда то я это делал через "union", а теперь гляжу этот put()  добавили.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Я не могу 7-ми значное число в типе long поделить на отдельные цифры в типе int что бы записать их в EEPROM.

После записи мне нужно будет считывать данные цифры и переводить их в целое число в типе long.

Это нужно мне для велокомпьютера. Как это организовать?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Да, мне нужно делить для того, что бы записать число например 1234567 в EEPROM, а так как максимальное значение ячейки EEPROM равно 255, то мне нужно записывать по одной цифре.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Еще не пойму, почему когда добавляю число большое, то получаю -3191, что то с типами переменных?

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Если что, вот мой код:

#include <EEPROM.h>
#include <Eeprom24C04_16.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Wire.h>      
int analogInput=A1;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0;
float R2 = 10000.0;
int value = 0;
long probegtek = 62345;
long probeg;
int probegtekpr=0;
int probegtekr;
float deltaD;
int b=0;
int c=0;
int d=0;
int e=0;
int g=0;
int f=0;
int i=0;
int b1=0; 
int c1=0;
int d1=0;
int e1=0;
int g1=0;
int f1=0;
int i1=0;
long probega=1234567;
#define EEPROM_ADDRESS  0x50
static Eeprom24C04_16 eeprom(EEPROM_ADDRESS);

LiquidCrystal lcd(2, 3, 4, 5 ,6 ,7);
//outputs speed of bicycle to LCD
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
 DallasTemperature sensors(&oneWire);
//calculations
//tire radius ~ 13.5 inches
//circumference = pi*2*r =~85 inches
//max speed of 35mph =~ 616inches/second
//max rps =~7.25
int m=0;
int mp = 8;
#define reed A0//pin connected to read switch
//storage variables
float radius = 13.0;// tire radius (in inches)- CHANGE THIS FOR YOUR OWN BIKE
float kmh = 0.00;
int reedVal;
long timer = 0;// time between one full rotation (in ms)
float circumference;
int x=0;

int maxReedCounter = 100;//min time (in ms) of one rotation (for debouncing)
int reedCounter;
//File myFile;




byte zg[8] =
 {
   B00111,
   B00101,
   B00111,
   B00000,
   B00000,
   B00000,
   B00000,
   B00000,
 };
 byte bt0[8] =
 {
   B01110,
   B11111,
   B10001,
   B10001,
   B10001,
   B10001,
   B10001,
   B11111,
 };
 byte bt20[8] =
 {
   B01110,
   B11111,
   B10001,
   B10001,
   B10001,
   B10001,
   B11111,
   B11111,
 };
 byte bt40[8] =
 {
   B01110,
   B11111,
   B10001,
   B10001,
   B10001,
   B11111,
   B11111,
   B11111,
 };
 byte bt60[8] =
 {
   B01110,
   B11111,
   B10001,
   B10001,
   B11111,
   B11111,
   B11111,
   B11111,
 };
 byte bt80[8] =
 {
   B01110,
   B11111,
   B10001,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
 };
 byte bt100[8] =
 {
   B01110,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
   B11111,
 };
 byte loading[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

void setup()
{
  eeprom.initialize();
  lcd.createChar(2, zg);
  lcd.createChar(3, bt0);
  lcd.createChar(4, bt20);
  lcd.createChar(5, bt40);
  lcd.createChar(6, bt60);
  lcd.createChar(7, bt80);
  lcd.createChar(1, bt100);
  lcd.createChar(0, loading);
  lcd.begin(16, 2);
    pinMode(analogInput, INPUT);


  reedCounter = maxReedCounter;
  circumference = 2*3.14*radius;
  pinMode(reed, INPUT);
  pinMode(mp, INPUT);
  

  cli();

  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 1999;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS11); 
  TIMSK1 |= (1 << OCIE1A);
  
  sei();

  
  deltaD = 2*3.415926535*radius*0.025;
  sensors.begin();
  
sensors.requestTemperatures(); 

value = analogRead(analogInput);
  vout = (value * 5.0)/1024.0;
  vin = vout/(R2/(R1+R2));
  if(vin<0.09)
  {
    vin=0.0;
  }

b1 = EEPROM.read(0);
c1 = EEPROM.read(1);
d1 = EEPROM.read(2);
e1 = EEPROM.read(3);
g1 = EEPROM.read(4);
f1 = EEPROM.read(5);
i1 = EEPROM.read(6);
probeg = (b1 * 1000000)+(c1*100000)+(d1*10000)+(e1*1000)+(g1*100)+(f1*10)+i1;
for(int i=0; i<20; i++)
{
  EEPROM.write(i, 0);
  delay(5);
}


//Boot:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("    Loading.    ");
lcd.setCursor(0, 1);
lcd.print("VeloPC  ver: 1.0");
delay(1700);
lcd.clear();
lcd.setCursor(0, 0);
lcd.clear();
lcd.print("    Welcome!    ");
lcd.setCursor(0, 1);
lcd.print("VeloPC  ver: 1.0");
delay(1700);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp= ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print("\2");
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Voltage= ");
lcd.print(vin);
lcd.print("V");
delay(2500);
lcd.clear();
   


}


ISR(TIMER1_COMPA_vect) {
  reedVal = digitalRead(reed);
  if (reedVal){
    if (reedCounter == 0){
      kmh = (56.8*float(circumference))/float(timer)*1.61;
      probegtek += deltaD;
     
  
      timer = 0;
      reedCounter = maxReedCounter;
      
    }
    else{
      if (reedCounter > 0){
        reedCounter -= 1;
      }
    }
  }
  else{
    if (reedCounter > 0){
      reedCounter -= 1;
    }
  }
  if (timer > 2000){
    kmh = 0;
  }
  else{
    timer += 1;
  } 


  
}




void loop()
{
 
  //Write to EEPROM
  if(analogRead(A2) > 900)
  {

    probegtekr = probegtek - probegtekpr;
probeg = probeg + probegtekr;
b =  probeg / 1000000;
c = (probeg / 100000) % 10;
d = (probeg / 10000) % 10;
e = (probeg / 1000) % 10;
g = (probeg / 100) % 10;
f = (probeg / 10) % 10;
i =  probeg % 10;


  EEPROM.write(0, 0);
  delay(15);
  EEPROM.write(1, 0);
  delay(15);
  EEPROM.write(2, 0);
  delay(15);
  EEPROM.write(3, 0);
  delay(15);
  EEPROM.write(4, 0);
  delay(15);
  EEPROM.write(5, 0);
  delay(15);
  EEPROM.write(6, 0);
  delay(15);
  EEPROM.write(0, b);
  delay(15);
  EEPROM.write(1, c);
  delay(15);
  EEPROM.write(2, d);
  delay(15);
  EEPROM.write(3, e);
  delay(15);
  EEPROM.write(4, g);
  delay(15);
  EEPROM.write(5, f);
  delay(15);
  EEPROM.write(6, i);
  delay(15);
  probegtekpr = probegtek;
  lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Distance Save! ");
    lcd.setCursor(0 ,1);
    lcd.print("All: ");
    lcd.print(probeg);
    lcd.print(" M");
    delay(1500);
  }  
  

  
  

sensors.requestTemperatures();  

  value = analogRead(analogInput);
  vout = (value * 5.0)/1024.0;
  vin = vout/(R2/(R1+R2));
  if(vin<0.09)
  {
    vin=0.0;
  }


//Read "Clear"
if(digitalRead(10) == HIGH)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Total clear!  ");
  delay(1500);
  probegtek=0;
}

  if(digitalRead(mp) == HIGH)
  {
    m++;
    if(m > 1)
    {
      m=0;
    }

  }
  if(m == 0)
  {
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(kmh);
  lcd.setCursor(5, 0);
  lcd.print(" km/h");
  lcd.setCursor(11, 0);
  if(vin > 7.40)
  {
    lcd.print("\1");
    lcd.print("100%");
  }
  else if(vin > 7.24 && vin < 7.40)
  {
    lcd.print("\1");
    lcd.print(" ");
    lcd.print("90%");
  }
  else if(vin > 7.09 && vin < 7.24)
  {
    lcd.print("\7");
    lcd.print(" ");
    lcd.print("80%");
  }
  else if(vin > 6.94 && vin < 7.09)
  {
    lcd.print("\7");
    lcd.print(" ");
    lcd.print("70%");
  }
  else if(vin > 6.79 && vin < 6.94)
  {
    lcd.print("\6");
    lcd.print(" ");
    lcd.print("60%");
  }
  else if(vin > 6.64 && vin < 6.79)
  {
    lcd.print("\6");
    lcd.print(" ");
    lcd.print("50%");
  }
  else if(vin > 6.48 && vin < 6.64)
  {
    lcd.print("\5");
    lcd.print(" ");
    lcd.print("40%");
  }
  else if(vin > 6.36 && vin < 6.48)
  {
    lcd.print("\5");
    lcd.print(" ");
    lcd.print("30%");
  }
  else if(vin > 6.18 && vin < 6.36)
  {
    lcd.print("\4");
    lcd.print(" ");
    lcd.print("20%");

  }
  else if(vin > 6.03 && vin < 6.18 )
  {
    lcd.print("\4");
    lcd.print(" ");
    lcd.print("10%");
  }
  else if(vin < 6.00)
  {
    lcd.print("\3");
    lcd.print(" ");
    lcd.print("00%");
  }
  lcd.setCursor(0, 1);
  lcd.print("Dst: ");
  lcd.print(probegtek);
  lcd.print(" M");
  //lcd.print(probeg);
 
  }
  else if(m == 1)
  {

    /*lcd.setCursor(0, 0);
    lcd.print("Temp = ");
    lcd.print(sensors.getTempCByIndex(0));
    lcd.print("\2");
    lcd.print("C   ");
    lcd.setCursor(0, 1);
    lcd.print("Voltage = ");
    lcd.print(vin);
    lcd.print("V");*/
    lcd.clear();
    lcd.setCursor(0, 0);
lcd.print(probeg);
        lcd.setCursor(0, 1);
    lcd.print(b1);
    lcd.setCursor(2, 1);
    lcd.print(c1);
    lcd.setCursor(4, 1);
    lcd.print(d1);
    lcd.setCursor(6, 1);
    lcd.print(e1); 
    lcd.setCursor(8, 1);
    lcd.print(g1); 
    lcd.setCursor(10, 1);
    lcd.print(f1);
    lcd.setCursor(12, 1);
    lcd.print(i1);

  }
if(vin < 6.00)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Low Battery!  ");
  lcd.setCursor(0, 1);
  lcd.print(" Charge Battery ");
}
  
}
  

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Мля. Анек вспомнил. Идет дебил по лесу - видит грибочек.

Говорит:

ГРЫБоШеК ....

грибочек говорит - я волшебный, исполню ТРИ твоих желания!

Дебил - хачу быть нормальным....

1!

УСРАТЬСЯ!

ПСССССССССССССССС

ЕБАНУТЬСЯ!

--------------

Грыбошек.......

MagicianT
Offline
Зарегистрирован: 03.10.2015

А можно и так: http://playground.arduino.cc/Code/EEPROMReadWriteLong

Вобщем, разбивать на цифры самый не эффективный способ. А какой из 3-х предложеных мной способ лучше решайте сами.

1. put()
2. union
3. ReadWriteLong.
at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Пример

#include <OneWire.h>
#include <EEPROM.h>

OneWire ds(2); // выход считывателя на 10 пин
byte addr[8];// буфер приема
byte addr1[8] = {1,2,3,4,5,6,7,8};
byte result;
byte xxx=255;

void setup() {// стар,товая инициализация
    Serial.begin(9600);
    delay(100);
    Serial.println("Start...");
}

   
void loop() {
  result=1;
     if(ds.reset()){ // если обнаружено устройттво
        ds.write(0x33); // отправляем команду "считать ROM" 
        delay(10); // на всякий случай ждем
        for(int i=0;i<8;i++)
        {
            addr[i] = ds.read(); // считываем
        }
        xxx=EEPROM.read(0);
        if (xxx==255){
          for(int i = 0; i < 8; i++){
           EEPROM.write(i,addr[i]);
           }
        }else{
          for(int i = 0; i < 8; i++){
          addr1[i]=EEPROM.read(i);
          if (addr[i]==addr1[i] && result){
            result=1;
          }else{result=0;}
          }
        }
        Serial.print("ROM =."); // выводим
        for(int i = 0; i < 8; i++)
        {
           Serial.print(addr[i],HEX);
           Serial.print(".");
        }
        Serial.println(result);
        Serial.println();
        delay(1000);
      }
}

 

rapidshe
Offline
Зарегистрирован: 31.12.2015

на днях задался таким же вопросом. да и вопрос то не аппаратный...

http://arduino.ru/forum/programmirovanie/zakhvatit-znachenie-i-pereopredelit-konstantu

diger67
Offline
Зарегистрирован: 25.07.2015

Nazar_Diadiun пишет:

Да, мне нужно делить для того, что бы записать число например 1234567 в EEPROM, а так как максимальное значение ячейки EEPROM равно 255, то мне нужно записывать по одной цифре.

А не рассматриваль вопрос хранить в памяти float. Делим ваше значение на 100000 и сохраняем в EEPROM. Надо вытаскиваем умножаем на 100000 и пользуемся. На сколько я помню float в IDE Arduino имеет хвостик до 5 знаков после запяитой. Опять же на просторах интернета находил функции записи EEPROM float.

void EEPROM_float_write(int addr, float Value)
{
  byte *x = (byte *)&Value;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}

float EEPROM_float_read(int addr)
{
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
  return y[0];
}

 

Вот эти функции, дефайним адреса ячеек EEPROM и пользуемся.

MikSer
Offline
Зарегистрирован: 27.01.2012
void setup() {
  Serial.begin(9600);
}

void loop() {

  uint16_t MyVar = 20000; //объявляем 16 битную переменную типа интегер

  byte Lo = lowByte(MyVar); // записываем младший байт
  byte Hi = highByte(MyVar); // записываем старший байт

  Serial.print("16 bit integer: ");
  Serial.println(MyVar);

  Serial.print("Low byte: ");
  Serial.println(Lo, HEX);

  Serial.print("High byte: ");
  Serial.println(Hi, HEX);

  uint16_t NewVar = ((Lo << 0) & 0xFF) + ((Hi << 8) & 0xFF00); //обратная конверсия в 16 бит

  Serial.print("Convert to 16 bit integer: ");
  Serial.println(NewVar);


  delay(5000);

}

 

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

Nazar_Diadiun пишет:

Да, мне нужно делить для того, что бы записать число например 1234567 в EEPROM, а так как максимальное значение ячейки EEPROM равно 255, то мне нужно записывать по одной цифре.

Не нужно Вам ничего делить. Пишите сразу long функцией put, как Вам тут советовали, а потом читайте функцией get и всё будет нормально - запишется 4 байта и прочитается столько же.

Nazar_Diadiun
Offline
Зарегистрирован: 26.02.2016

Я знал, я верил что найдется такой человек как Вы diger67!

Спасибо большое что направили на правильный путь, скачал библиотеку EEPROMEx и о чудо!

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013