Работа с EPROM

Тема в разделе "Arduino & Shields", создана пользователем sanik, 14 мар 2015.

  1. sanik

    sanik Гик

    Добрый вечер! Никогда не приходилось работать с энергонезависимой памятью, подскажите пожалуйста как состояния переключателей (режимов) сохранять в памяти?
    Код (Text):
    #include <Servo.h>
    Servo privodS;
    int servoPin = 9;//15
    int fotoPin = 0;//23
    int ledPin = 8;  //14  Светодиод реверса
    int ButPin = 2; //4
    int ButPinRev =5; //11
    // segments // номер вывода контроллера + номер вывода индикатора
    int a = 4;//6+ 3
    int e = 13; //19+ 7
    int j = 6;//12 + 8
    int d = 7;//13 + 6
    int b = 10;//16 + 9
    int f = 11;//17 + 4
    int g = 15;// 24+ 1

    int flag = 0;                  // флаг состояния
    int regim = 0;                // Переключалка
    int flagRev = 0;
    int regimRev = 0;

    int pos = 0;
    int pos1 = 0;
    int pos2 = 0;
    int pos3 = 0;
    int pos4 = 0;
    int pos5 = 0;
    int pos6 = 0;
    int pos7 = 0;
    void setup()
    {
      Serial.begin(9600);
      pinMode(ledPin, OUTPUT);
      privodS.attach(servoPin);
      pinMode(a, OUTPUT);
      pinMode(b, OUTPUT);
      pinMode(j, OUTPUT); //сегмент c заменен на сегмент J
      pinMode(d, OUTPUT);
      pinMode(e, OUTPUT);
      pinMode(f, OUTPUT);
      pinMode(g, OUTPUT);
     
     
     
    }
    void loop()
    {
    // реверс
      if(digitalRead(ButPinRev) == HIGH && flagRev == 0)
      {
        regimRev ++;
        flagRev = 1;
       
        if(regimRev > 1)
        {
          regimRev = 0;
        }
      }
      if(digitalRead(ButPinRev) == LOW && flagRev == 1)
      {
        flagRev = 0;
      }
      // режимы
      if(digitalRead(ButPin) == HIGH && flag == 0)    
        {                                            
          regim ++;
          flag = 1;
         
          if(regim > 7)                    // Если номер режима превышает требуемого
            {                              // то отсчет начинается с нуля
              regim = 0;
            }
        }
     
      if(digitalRead(ButPin) == LOW && flag == 1)
        {
          flag = 0;
        }
        // ======= Вполняем задачу при выборе реверса =======
        // ПРЯМОЕ Вращение
        if(regimRev == 0)
        {
          digitalWrite(ledPin, HIGH);
        }
        // ОБРАТНОЕ Вращение
        if(regimRev == 1)
        {
          digitalWrite(ledPin, LOW);
         
        }
    // ======= Вполняем задачу при выборе режима =======

    // РЕЖИМ 1:
      if(regim == 0)
        {
            digitalWrite(a, HIGH);
            digitalWrite(b, LOW);
            digitalWrite(j, LOW);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
           
        }
       
    // РЕЖИМ 2:
      if(regim == 1)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, LOW);
          digitalWrite(j, HIGH);
          digitalWrite(d, LOW);
          digitalWrite(e, LOW);
          digitalWrite(f, HIGH);
          digitalWrite(g, LOW);
         
        }

    // РЕЖИМ 3:
      if(regim == 2)
      {
        digitalWrite(a, LOW);
        digitalWrite(b, LOW);
        digitalWrite(j, LOW);
        digitalWrite(d, LOW);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, LOW);
       
      }
    // РЕЖИМ 4:
      if(regim == 3)
        {
          digitalWrite(a, HIGH);
          digitalWrite(b, LOW);
          digitalWrite(j, LOW);
          digitalWrite(d, HIGH);
          digitalWrite(e, HIGH);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
       
        }
    // РЕЖИМ 5:
      if(regim == 4)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, HIGH);
          digitalWrite(j, LOW);
          digitalWrite(d, LOW);
          digitalWrite(e, HIGH);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
         
        }
    // РЕЖИМ 6:
      if(regim == 5)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, HIGH);
          digitalWrite(j, LOW);
          digitalWrite(d, LOW);
          digitalWrite(e, LOW);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
          privodS.write (pos5);
        }
    // РЕЖИМ 7:
      if(regim == 6)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, LOW);
          digitalWrite(j, LOW);
          digitalWrite(d, HIGH);
          digitalWrite(e, HIGH);
          digitalWrite(f, HIGH);
          digitalWrite(g, HIGH);
         
        }
    // РЕЖИМ 8:
      if(regim == 7)
      {
        digitalWrite(a, LOW);
        digitalWrite(b, LOW);
        digitalWrite(j, LOW);
        digitalWrite(d, LOW);
        digitalWrite(e, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, LOW);
       
      }
    }
     
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

  3. sanik

    sanik Гик

    Я правильно понял?
    Код (Text):
    #include <Servo.h>
    #include <EEPROM.h>
    Servo privodS;
    int servoPin = 9;//15
    int fotoPin = 0;//23
    int ledPin = 8;  //14  Светодиод реверса
    int ButPin = 2; //4
    int ButPinRev =5; //11
    // segments // номер вывода контроллера + номер вывода индикатора
    int a = 4;//6+ 3
    int e = 13; //19+ 7
    int j = 6;//12 + 8
    int d = 7;//13 + 6
    int b = 10;//16 + 9
    int f = 11;//17 + 4
    int g = 15;// 24+ 1

    int flag = 0;                  // флаг состояния
    int regim = 0;                // Переключалка
    int flagRev = 0;
    int regimRev = 0;

    int pos = 0;
    int pos1 = 0;
    int pos2 = 0;
    int pos3 = 0;
    int pos4 = 0;
    int pos5 = 0;
    int pos6 = 0;
    int pos7 = 0;
    void setup()
    {
      Serial.begin(9600);
      pinMode(ledPin, OUTPUT);
      privodS.attach(servoPin);
      pinMode(a, OUTPUT);
      pinMode(b, OUTPUT);
      pinMode(j, OUTPUT); //сегмент c заменен на сегмент J
      pinMode(d, OUTPUT);
      pinMode(e, OUTPUT);
      pinMode(f, OUTPUT);
      pinMode(g, OUTPUT);
    uint8_t regimRev;
    uint8_t regim;
    regimRev = EEPROM.read(0);
    regim = EEPROM.read(1);
    }
    void loop()
    {
    // реверс
      if(digitalRead(ButPinRev) == HIGH && flagRev == 0)
      {
        regimRev ++; // увеличиваем счетчик на единицу
        EEPROM.write(0, regimRev); //Записываем значение счетчика
        flagRev = 1;

        if(regimRev > 1)
        {
          regimRev = 0;
        }
      }
     
      if(digitalRead(ButPinRev) == LOW && flagRev == 1)
      {
        flagRev = 0;
      }
      // режимы
      if(digitalRead(ButPin) == HIGH && flag == 0)  
        {                                          
          regim ++;
          flag = 1;
       
          if(regim > 7)                    // Если номер режима превышает требуемого
            {                              // то отсчет начинается с нуля
              regim = 0;
            }
        }
      if(digitalRead(ButPin) == LOW && flag == 1)
        {
          flag = 0;
        }
        // ======= Вполняем задачу при выборе реверса =======
        // ПРЯМОЕ Вращение
        if(regimRev == 0)
        {
          digitalWrite(ledPin, HIGH);
        }
        // ОБРАТНОЕ Вращение
        if(regimRev == 1)
        {
          digitalWrite(ledPin, LOW);
       
        }
    // ======= Вполняем задачу при выборе режима =======

    // РЕЖИМ 1:
      if(regim == 0)
        {
            digitalWrite(a, HIGH);
            digitalWrite(b, LOW);
            digitalWrite(j, LOW);
            digitalWrite(d, HIGH);
            digitalWrite(e, HIGH);
            digitalWrite(f, HIGH);
            digitalWrite(g, HIGH);
         
        }
     
    // РЕЖИМ 2:
      if(regim == 1)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, LOW);
          digitalWrite(j, HIGH);
          digitalWrite(d, LOW);
          digitalWrite(e, LOW);
          digitalWrite(f, HIGH);
          digitalWrite(g, LOW);
       
        }

    // РЕЖИМ 3:
      if(regim == 2)
      {
        digitalWrite(a, LOW);
        digitalWrite(b, LOW);
        digitalWrite(j, LOW);
        digitalWrite(d, LOW);
        digitalWrite(e, HIGH);
        digitalWrite(f, HIGH);
        digitalWrite(g, LOW);
     
      }
    // РЕЖИМ 4:
      if(regim == 3)
        {
          digitalWrite(a, HIGH);
          digitalWrite(b, LOW);
          digitalWrite(j, LOW);
          digitalWrite(d, HIGH);
          digitalWrite(e, HIGH);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
     
        }
    // РЕЖИМ 5:
      if(regim == 4)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, HIGH);
          digitalWrite(j, LOW);
          digitalWrite(d, LOW);
          digitalWrite(e, HIGH);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
       
        }
    // РЕЖИМ 6:
      if(regim == 5)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, HIGH);
          digitalWrite(j, LOW);
          digitalWrite(d, LOW);
          digitalWrite(e, LOW);
          digitalWrite(f, LOW);
          digitalWrite(g, LOW);
          privodS.write (pos5);
        }
    // РЕЖИМ 7:
      if(regim == 6)
        {
          digitalWrite(a, LOW);
          digitalWrite(b, LOW);
          digitalWrite(j, LOW);
          digitalWrite(d, HIGH);
          digitalWrite(e, HIGH);
          digitalWrite(f, HIGH);
          digitalWrite(g, HIGH);
       
        }
    // РЕЖИМ 8:
      if(regim == 7)
      {
        digitalWrite(a, LOW);
        digitalWrite(b, LOW);
        digitalWrite(j, LOW);
        digitalWrite(d, LOW);
        digitalWrite(e, LOW);
        digitalWrite(f, LOW);
        digitalWrite(g, LOW);
     
      }
    }
     
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Правильно, только читаете две переменные, а запись я только одной разглядел.
     
  5. sanik

    sanik Гик

    Спасибо большое! Это кусочек кода для того чтоб разобраться :)
     
  6. Николя

    Николя Нуб

    Приветствую. Напишу здесь дабы не плодить темы. Столкнулся я с неразрешимой проблемой (для меня). Нужно текущую температуру зафиксировать и от нее управлять реле. То есть, при увеличении на 0,2 градуса, реле включается, при возвращении назад отключается. Наставьте на путь истинный, а то си моих больше нет. Вот код куда это нужно
    Код (Text):
    #include <OneWire.h>
    OneWire  ds(10);  // Подключаем датчик к 10 цифровому пину
    // Для дисплея
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);

    //float tempRect=0; //переменная для текущего значения температуры
    //float tempFix=0; //переменная для зафиксированной температуры
    //int setTmp=0; // переменная для заданного значения температуры

    void setup(void) {
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      display.clearDisplay();
     
      Serial.begin(9600);
      pinMode(3, OUTPUT); //пин реле
      digitalWrite(3, LOW);  // Включаем реле
    }

    void loop(void) {
      byte i;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;

      // Ищем алрес датчика
      if ( !ds.search(addr)) {
        //Serial.println("No more addresses.");
        //Serial.println();
        ds.reset_search();
        delay(250);
        return;
      }

      // Проверяем не было ли помех при передаче
      if (OneWire::crc8(addr, 7) != addr[7]) {
        Serial.println("CRC is not valid!");
        return;
      }
      Serial.println();

      // Определяем серию датчика
      switch (addr[0]) {
      case 0x10:
        Serial.println("  RECTIFICAT");
        type_s = 1;
        break;
      case 0x28:
        Serial.println("  CRECTIFICAT");
        type_s = 0;
        break;
      case 0x22:
        Serial.println("  RECTIFICAT");
        type_s = 0;
        break;
      default:
        Serial.println("Device is not a DS18x20 family device.");
        return;
      }

      ds.reset();          
      ds.select(addr);      // Выбираем адрес
      ds.write(0x44, 1);    // Производим замер, в режиме паразитного питания
      delay(1000);  

      ds.reset();
      ds.select(addr);  
      ds.write(0xBE);        // Считываем оперативную память датчика

      for ( i = 0; i < 9; i++) {        
        data[i] = ds.read();  // Заполняем массив считанными данными
      }

      // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
      int16_t raw = (data[1] << 8) | data[0];
        if (type_s) {
        raw = raw << 3;
        if (data[7] == 0x10) {
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      }
      else {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00) raw = raw & ~7;
        else if (cfg == 0x20) raw = raw & ~3;
        else if (cfg == 0x40) raw = raw & ~1;
      }
      celsius =  (float)raw / 16.0;
      fahrenheit = celsius * 1.8 + 32.0;
      Serial.print("T = ");
      Serial.print(celsius);
      Serial.print(" C");
      //Serial.print(fahrenheit);
    // Serial.println(" F");
    //Работа Дисплея
      display.clearDisplay();
      display.setCursor(0,5);
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.println("R"); //Надпись сверху дисплея
      display.setCursor(10,27);
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.println("KLAPAN"); //Знак температуры
      display.setCursor(60,23);
      display.setTextSize(2);
      display.setTextColor(WHITE);
      if (digitalRead(3)) display.println("ON"); // показываем состояние выхода
        else display.println(" OFF");
    // display.println("ON"); //Импровезированный знак градуса
      //display.setCursor(115,5);
      //display.setTextSize(2);
      //display.setTextColor(WHITE);
      //display.println("C"); //Импровезированный знак Цельсия
      display.setCursor(0,43);
      display.setTextSize(3);
      display.setTextColor(WHITE);
      display.print(celsius); //Выводим переменную на дисплей
      display.setCursor(98,43);
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.println("O"); //Импровезированный знак градуса
      display.setCursor(110,43);
      display.setTextSize(3);
      display.setTextColor(WHITE);
      display.println("C"); //Импровезированный знак Цельсия
      display.display();
      delay(1000);

      // Если температура достигает температуры кипения (с погрешностью), отключаем кипятильник
      if (celsius > 26.5)
      //{
        digitalWrite(3, HIGH);
        else digitalWrite(3, LOW);
    // }
    }
     
     
  7. DrProg

    DrProg Вечный нерд

    Ниже функция при помощи которой я инициализирую данные в EEPROM если их нет и считываю если они есть. В COD_EEPROM выше надо записать любое число от 0 до 254 которое будет уникальным флагом того, что осмысленная запись в памяти есть.

    Код (Text):

    #define COD_EEPROM 112    // код записи EEPROM
    uint8_t keySensor[8][2];

    //-----------------------------------------------------------------------------------

    void getEEPROM () { // заполнения массива ключевых значений датчиков из памяти или установка по умолчанию в случае первого запуска
      if (EEPROM.read(0) != COD_EEPROM) {          // данных нет (или устарели), записываем по умолчанию
        keySensor[0][0] = 40; keySensor[0][1] = 70; // влажность почвы полив №1
        keySensor[1][0] = 20; keySensor[1][1] = 40; // влажность почвы полив №2
        keySensor[2][0] = 25; keySensor[2][1] = 30; // температура воздуха проветривание пассивное
        keySensor[3][0] = 30; keySensor[3][1] = 35; // температура воздуха проветривание активное
        keySensor[4][0] = 30; keySensor[4][1] = 60; // влажность воздуха
        keySensor[5][0] = 10; keySensor[5][1] = 15; // освещенность
        keySensor[6][0] = 15; keySensor[6][1] = 20; // температура для активного подогрева
        keySensor[7][0] = 20; keySensor[7][1] = 22; // температура для пассивного подогрева
        EEPROM.put(1, keySensor);
        EEPROM.update(0, COD_EEPROM);  // отметили наличие данных
      }
      EEPROM.get(1, keySensor);
    }