Поделить число, и записать его в EEPROM.
- Войдите на сайт для отправки комментариев
Сб, 27/02/2016 - 19:13
Необходимо поделить 7-ми значное число на отдельные цифры и записать их для хранения. Также необходима возможность сложить данные цифры в 7-ми значное число обратно. Как-то так :)
А put() не пробовали?
https://www.arduino.cc/en/Reference/EEPROMPut
А пояснить не можете? Просто не очень английский знаю.
Необходимо поделить 7-ми значное число на отдельные цифры и записать их для хранения. Также необходима возможность сложить данные цифры в 7-ми значное число обратно. Как-то так :)
В посте нет никакого вопроса и/или просьбы. Есть только утверждение. Так что отвечать особо не на что.
Если бы это всё-таки был вопрос, типа "как это сделать", то здесь явно не хватает пояснения в каком типе данных (представлении) оное число находится.
Дак там же пример есть. А С/C++ он весь на английском. Я так понимаю, что на цифры делите потому что в ЕЕПРОМ байты надо писать? Когда то я это делал через "union", а теперь гляжу этот put() добавили.
Я не могу 7-ми значное число в типе long поделить на отдельные цифры в типе int что бы записать их в EEPROM.
После записи мне нужно будет считывать данные цифры и переводить их в целое число в типе long.
Это нужно мне для велокомпьютера. Как это организовать?
Да, мне нужно делить для того, что бы записать число например 1234567 в EEPROM, а так как максимальное значение ячейки EEPROM равно 255, то мне нужно записывать по одной цифре.
Еще не пойму, почему когда добавляю число большое, то получаю -3191, что то с типами переменных?
Если что, вот мой код:
#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 "); } }Мля. Анек вспомнил. Идет дебил по лесу - видит грибочек.
Говорит:
ГРЫБоШеК ....
грибочек говорит - я волшебный, исполню ТРИ твоих желания!
Дебил - хачу быть нормальным....
1!
УСРАТЬСЯ!
ПСССССССССССССССС
ЕБАНУТЬСЯ!
--------------
Грыбошек.......
А можно и так: http://playground.arduino.cc/Code/EEPROMReadWriteLong
Вобщем, разбивать на цифры самый не эффективный способ. А какой из 3-х предложеных мной способ лучше решайте сами.
Пример
#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); } }на днях задался таким же вопросом. да и вопрос то не аппаратный...
http://arduino.ru/forum/programmirovanie/zakhvatit-znachenie-i-pereopredelit-konstantu
Да, мне нужно делить для того, что бы записать число например 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 и пользуемся.
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); }Да, мне нужно делить для того, что бы записать число например 1234567 в EEPROM, а так как максимальное значение ячейки EEPROM равно 255, то мне нужно записывать по одной цифре.
Не нужно Вам ничего делить. Пишите сразу long функцией put, как Вам тут советовали, а потом читайте функцией get и всё будет нормально - запишется 4 байта и прочитается столько же.
Я знал, я верил что найдется такой человек как Вы diger67!
Спасибо большое что направили на правильный путь, скачал библиотеку EEPROMEx и о чудо!
http://arduino.ru/forum/programmirovanie/zapis-i-chtenie-eeprom-peremenn...