Добрый вечер! Никогда не приходилось работать с энергонезависимой памятью, подскажите пожалуйста как состояния переключателей (режимов) сохранять в памяти? Код (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); } }
Я правильно понял? Код (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); } }
Приветствую. Напишу здесь дабы не плодить темы. Столкнулся я с неразрешимой проблемой (для меня). Нужно текущую температуру зафиксировать и от нее управлять реле. То есть, при увеличении на 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); // } }
Ниже функция при помощи которой я инициализирую данные в 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); }