Помогите новичку. Вентилятор + датчик температуры

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Damir, 7 апр 2013.

  1. Razor

    Razor Нерд

    Кстати, вот код для перевода показаний термистора в градусы цельсия, для термистора из Амперки работает без изменений, вроде как:
    Код (Text):
    double getTemperature() {
      double data = log(((10240000 / analogRead(TEMP_SENSOR)) - 10000));
      data = 1 / (0.001129148 + (0.000234125 * data) + (0.0000000876741 * data * data * data)) - 273.15;
      return data;
    }
     
  2. grx1a

    grx1a Гик

    это более простой вариант, можно конечно и по хлеще замутить, и сложить эти два варианта воедино, но здесь надо подумать как это осуществить
     
  3. Damir

    Damir Нерд

    Верно. Это формула для получения температуры основываясь на данных получаемых от термистра. У меня пока так

    Код (Text):
    int ledPin = 12;
    int gran = 30;
    int sensePin = 0;
     
    void setup(){
      analogReference(DEFAULT);
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
    }
     
     
    // создаем метод для перевода показаний сенсора в градусы Цельсия
    double Getterm(int RawADC) {
      double temp;
      temp = log(((10240000/RawADC) - 10000));
      temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
      temp = temp - 273.15;
      return temp;
    }
     
    void loop(){
      double temp = Getterm(analogRead(sensePin));  // считываем показания с сенсора
      if ((int) temp >= gran) {
        digitalWrite(ledPin, HIGH);
      } else {
        digitalWrite(ledPin, LOW);
      }
    }
    Все что делает это сравнивает с заданной глобально переменной grad и если значение выше чем заданно то даем сигнал.
     
  4. Damir

    Damir Нерд

    Помогите мне со следующим советом или кодом, выше писал про пхп, но решил использовать Java для того, чтобы общаться с адруино через com порт, как раз хотел давно и Java подучить. Нашел библиотеку jSSC, подключил. Не смог ничего сделать.

    Стал пытаться просто через Serial отправить и отобразить в адруино данные из Serial Monitora. Как оказалось, это не так просто, что то отравить через com порт и понять что там отправлено.

    Вот этот код смог получить из сериал монитора и отобразить там же то что я посылаю

    Код (Text):
    char s[20];
    int k;
    int i=0;
     
    void setup(){
      analogReference(DEFAULT);
      Serial.begin(9600);
    }
     
    void loop(){
      while (Serial.available() > 0)
      {
      s[i]=Serial.read();
      i++;
      // ждем пока приедет следующий символ
      delay (2);
      // защищаемся от переполнения буфера
      if (i>=20) break;
      }
     
      if (i > 0) {
        for (k=0; k<i;k++) Serial.print(s[k]);
        Serial.println("");
        i=0;
      }
     
    }
    Там получается массив символов, но мне надо на адруино передать скажем число 31 (в моей теме это заданная температура по достижении которого запускается кулер) и чтобы плата это поняла что это число 31.
     
  5. Damir

    Damir Нерд

    Да, я пока подключил его напрямую. Но он вроде как я понимаю рассчитан на 12В. В инете почитал какой провод за что отвечает, включил заземление к заземлению, 5В туда где 12В, крутится но не сильно. Пока над этим не парюсь, в приоритете сделать общение Программа <-> Адруино
     
  6. HighDigital

    HighDigital Гик

    Настоятельно не рекомендую подключать напрямую! Как не как - а все таки мотор, который может пины сжечь, а соответственно и ATMega328P...
     
  7. Damir

    Damir Нерд

    Хорошо. Исправим:)
     
  8. HighDigital

    HighDigital Гик

    Я вас не заставляю это делать, я лишь предложил вам для большей безопасности, решать вам :)
     
  9. Razor

    Razor Нерд

    По-хорошему, например, если порог 25, надо начинать охлаждать с 27 и до 23, потом снова ждать 27. Иначе может постоянно включаться-выключаться.
     
    Megakoteyka нравится это.
  10. Damir

    Damir Нерд

    Всем привет.

    Начал работу над клиентской частью, реализую веб-приложение, которое пишу на php... столкнулся с такой проблемой... Мне надо подружить php и Адруино. Пхп в принципе отправляет данные на Адруино через СОМ порт, и плата считывает. А вот обратно не хочется читать, использую класс php_serial.class, вся загвозка у меня Винда. На винде считывание не пашет. Помогите считать данные которые Адруино посылает через порт....
    Скрипт
    PHP:
    <?
    include "php_serial.class.php";
     
    // Let's start the class
    $serial = new phpSerial;
     
    // First we must specify the device. This works on both linux and windows (if
    // your linux serial device is /dev/ttyS0 for COM1, etc)
    $serial->deviceSet("COM4");
     
    // Then we need to open it
    $serial->deviceOpen();
     
    // To write into
    $serial->sendMessage("1");
     
    // Or to read from
    $read = $serial->readPort();
    echo "Answer from Adruino: "+$read;
    // If you want to change the configuration, the device must be closed
    $serial->deviceClose();
     
    // We can change the baud rate
    $serial->confBaudRate(9600);
     
    ?>
    Адруино
    Код (Text):
    char s[20];
    int k;
    int i=0;
     
    void setup(){
      analogReference(DEFAULT);
      Serial.begin(9600);
    }
     
    void loop(){
     
      while (Serial.available() > 0)
      {
      s[i]=Serial.read();
      i++;
      // ждем пока приедет следующий символ
      delay (2);
      // защищаемся от переполнения буфера
      if (i>=20) break;
      }
     
      if (i > 0) {
        for (k=0; k<i;k++) Serial.print(s[k]);
        Serial.println("");
        i=0;
      }
    }
     
  11. hibiki

    hibiki Гик

    пхп как-нибудь ругается? или что вообще происходит?

    что за класс такой - phpSerial? оно http://code.google.com/p/php-serial/ ?
     
  12. Damir

    Damir Нерд

    В общем в этом классе, кстати ты верно указал, стоит проверка если Винда, то он выдает сообщение что для винды это не работает. Решил тем, что прописал сам возвращаемое значение.
     
  13. Megakoteyka

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

    Откуда такая информация? Просмотрел код класса, ничего преступного по отношению к виндам там не увидел.
     
  14. Damir

    Damir Нерд

    Там есть такая функция
    PHP:
    function readPort ($count = 0)
        {
            if ($this->_dState !== SERIAL_DEVICE_OPENED)
            {
                trigger_error("Device must be opened to read it", E_USER_WARNING);
                return false;
            }
     
            if ($this->_os === "linux")
            {
                $content = ""; $i = 0;
     
                if ($count !== 0)
                {
                    do {
                        if ($i > $count) $content .= fread($this->_dHandle, ($count - $i));
                        else $content .= fread($this->_dHandle, 128);
                    } while (($i += 128) === strlen($content));
                }
                else
                {
                    do {
                        $content .= fread($this->_dHandle, 128);
                    } while (($i += 128) === strlen($content));
                }
     
                return $content;
            }
            elseif ($this->_os === "windows")
            {
                /* Do nohting : not implented yet */
              // $content = "";
     
                //if ($count > 0)
                //{
                    $content = fread($this->_dHandle, 128);
                //}
     
                return $content;
            }
     
            trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING);
            return false;
        }
    он просто выходил с ошибкой когда ОС - Виндоус
     
  15. Megakoteyka

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

    Ага, понятно, еще не реализовали. Я смотрел открытие порта - там к виндам было совсем другое отношение :)
    А вот тут (в первом комменте) предлагают из php обратиться к компоненту .Net System.IO.Ports.SerialPort при помощи класса DOTNET - не пробовали? Выглядит красиво ))
     
  16. Damir

    Damir Нерд

    помогите мне со следующим. Чувствую что все просто, но догадаться не могу(((

    Нужно следующее в общем, я хочу через порт посылать некие ключи значения, например такие:
    "1" - адруино должен послать текущую температуру
    "2" - адруино должен зажечь лампочку
    "3[какой то разделитель][значение]" - адруино должен записать в глобальную переменную значение, которое в последующем будет использоваться, скажем для того, чтобы если температура стала больше этого значения - загорелась лампочка.

    Вот код который считывает данные в виде массива.

    Код (Text):
    char s[20];
    int k;
    int temp;
    int i=0;
     
    void setup(){
      analogReference(DEFAULT);
      Serial.begin(9600);
    }
     
    void loop(){
     
      while (Serial.available() > 0)
      {
      s[i]=Serial.read();
      i++;
      // ждем пока приедет следующий символ
      delay (2);
      // защищаемся от переполнения буфера
      if (i>=20) break;
      }
    }
    В дальнейшем я сравниваю, например s[0]=='1' но это условие не проходит(((
     
  17. Damir

    Damir Нерд

    обязательно попробую...
     
  18. Damir

    Damir Нерд

    Не получается((
    Пишет следующее:
    Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80070002] Не удается найти указанный файл. ' in ....:3 Stack trace: #0 Z:\home\urazov.kz\www\example.php(3): dotnet->dotnet('system', 'System.IO.Ports...') #1 {main} thrown in .... on line 3

    example.php
    PHP:
    <?php
     
    $serial = new DOTNET('System', 'System.IO.Ports.SerialPort');
    $serial->PortName = 'COM3';
    $serial->Open();
    $serial->Close();
    ?>

    Думал может .Net не тот, скачал последний, установил. Не помогает.

    ЗЫ: Кстати, то что я писал выше, где подменил свое в функцию Readport не работает. Скрипт тупо висит, как завершается потом сом порт не отвечает... Никак не могу с винды прочитать то, что высылает сом порт
     
  19. grx1a

    grx1a Гик

    капец вы простой вопрос новичка разтянули в докторскую дисертацию!?
    Все же вроде проще, все примерно так выглядитю
    analogRead temperature sensor = actual parametrs +/- setParamrtres= deviation
    что тут можно придумать даже не знаю, все легко читается и расчитывается! не понимаю????
     
  20. grx1a

    grx1a Гик

    туда же при желании можно ввести гистерезис, и на его сновании сделать офигенную систему климат-конроля