Вольтметр-самописец

Тема в разделе "Глядите, что я сделал", создана пользователем sagis, 26 дек 2013.

  1. sagis

    sagis Нерд

    Возникла необходимость мониторить напряжение в сети 220В в течении суток, для этого было собрано следующее устройство. В качестве датчика использован Трансформатор с выпрямителем от зарядки мобильника, из которого выкинута схема стабилизации, плюс делитель на резисторах.
    [​IMG]
    Ну и собственно написан скетч
    Код (Text):
    //Подключаем библиотеки
    #include <SD.h> //Библиотека для чтения, записи SD карты
    #include <DS1307RTC.h>// Библиотеки
    #include <Time.h> // для работы
    #include <Wire.h> // часов

    const int chipSelect = 10;
    int analogPin =0; // объявляем пин датчика
    //————————————————————————
    void setup()
    {

      Serial.begin(9600); // инициализация com порта

      Serial.print("Initializing SD card…");
      pinMode(10, OUTPUT);
      if (!SD.begin(chipSelect)) {//инициализация SD карты
        Serial.println("Card failed, or not present");
        return;
      }
      Serial.println("card initialized.");
    }
    //————————————————————————
    void loop()
    {
      tmElements_t tm;

      String dataString = "";//объявляем переменную в которой будем хранить данные

      RTC.read(tm);// читаем данные с часов
      dataString+=(tmYearToCalendar(tm.Year));// читаем год и пишем в буфер
      dataString+= "/";
      dataString+= (tm.Month); // читаем месяц и пишем в буфер
      dataString+= "/";
      dataString+= (tm.Day); // читаем день и пишем в буфер
      dataString+= " ";
      dataString+= (tm.Hour);// читаем час и пишем в буфер
      dataString+= ":";
      dataString+= (tm.Minute);// читаем минуты и пишем в буфер
      dataString+= " ";

      int sensor = analogRead(analogPin)/3.58;// читаем данные с датчика и делим на коэффициент из пункта 2
      dataString += String(sensor);// дописываем в буфер

      File dataFile = SD.open("log.txt", FILE_WRITE);//Открываем SD для записи

      if (dataFile) {

        dataFile.println(dataString);// Пишем буфер на карту

        dataFile.close();

        Serial.println(dataString);

        delay(300000); //ждем 5 минут

      }
      else {
        Serial.println("error opening log.txt");
      }
    }
    Вроде работает нормально, выслушаю конструктивную критику
     
    Последнее редактирование: 29 дек 2013
    Securbond, ИгорьК и Megakoteyka нравится это.
  2. Megakoteyka

    Megakoteyka Оракул

    1. Можно было использовать sprintf для форматирования строки. Примерно так:
    Код (Text):
    char buf[64];
    sprintf(buf, "%2d:%2d:%2d voltage = %3.3fV\n", hh, mm, ss, voltage);
    У такого подхода следующие плюсы:
    - не используется динамическая память -> система работает более стабильно и предсказуемо
    - все поля в строках всегда будут одинаковой ширины, что упростит автоматический разбор файла в дальнейшем
    - меньше кода

    2. Строке
    Код (Text):
    int analogPin = 0; // объявляем пин датчика
    место рядом со строкой
    Код (Text):
    const int chipSelect = 10;
    Кстати, почему 0, а не A0?

    3. Перед публикацией исходников нажимайте Ctrl+T в Arduino IDE, пожалуйста.
     
    9xA59kK и sagis нравится это.
  3. sagis

    sagis Нерд

    Просто функция analogRead() работает с аналоговыми входами
    А вот с sprintf интересно попробовать, Спасибо.
     
    Последнее редактирование: 26 дек 2013
  4. Megakoteyka

    Megakoteyka Оракул

    Аналоговые входы - это же и есть А0-А5.
    Код стал выглядеть гораздо читабельней, так держать! :)
     
  5. sagis

    sagis Нерд

    Ваш вариант мне даже больше понравился, итого скетч переписал плюс убрал общение с компом так как устройство работает автономно в другом месте,
    плюс повесил светодиод на 5 пин который светится при наличии ошибок и гаснет при их устранении
    Код (Text):
    //Подключаем библиотеки
    //Библиотека для чтения, записи SD карты
    #include <SD.h>            
    // Библиотеки для работы часов
    #include <DS1307RTC.h>      
    #include <Time.h>            
    #include <Wire.h>
    // объявляем пин датчика
    int analogPin =0;            
    const int chipSelect = 10;
    //буфер
    char dataString [64];        
    // пин светодиода
    int led = 5;              

    //————————————————————————
    void setup()
    {

      //инициализация SD карты
      pinMode(10, OUTPUT);
      if (!SD.begin(chipSelect)) {
        digitalWrite(led, HIGH);
        return;
      }

      digitalWrite(led, LOW);
    }
    //————————————————————————
    void loop()
    {
      tmElements_t tm;
      // читаем данные с часов
      RTC.read(tm);                          
      // читаем данные с датчика и делим на коэффициент
      int sensor = analogRead(analogPin)/3.58;
      //разбираем данные и пишем в буфер
      sprintf(dataString, "%4d/%2d/%2d %2d:%2d %3d",tmYearToCalendar(tm.Year),tm.Month,tm.Day,tm.Hour,tm.Minute,sensor);
      //Открываем SD для записи
      File dataFile = SD.open("log.txt", FILE_WRITE);
      //пишем буфер на карту
      if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
        digitalWrite(led, LOW);
        //ждем 5 минут
        delay(300000);
      }
      else {

        digitalWrite(led, HIGH);
      }
    }
     
    Спасибо за помощь