Измерение температуры

Тема в разделе "Arduino & Shields", создана пользователем MeDiAtoR, 27 ноя 2012.

  1. MeDiAtoR

    MeDiAtoR Нуб

    Доброго времени суток всем. Прошу помощи разобраться с данной проблемой.(( я новичок в языке С, у меня проблемы с составлением кодов. Мягко говоря вообще ничего не знаю.
    кроме вот этого ничего не придумал ещё((
    int ledpin = 6;
    int ledpin1 = 13;
    int ledLevel = 0;
    void setup()
    {
    pinMode(ledpin, OUTPUT);
    pinMode(ledpin1, OUTPUT);

    }
    void loop()
    {
    ledLevel = 0;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel + 26;
    analogWrite(ledpin,ledLevel);
    delay(300);

    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 26;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 25;
    analogWrite(ledpin,ledLevel);
    delay(300);
    ledLevel = ledLevel - 26;
    analogWrite(ledpin,ledLevel);
    delay(300);


    }


    Но, скажу сразу) я в сфере электротехники уже более 10 лет)) с 6го класса. По профессии инженер электронщик, но все же трудно мне с языком С((
    У меня есть:
    ардуино уно
    очень много кнопок))
    проводов тоже.
    реле,(40-100 мА)
    транзисторный блок(ULN2003)
    оптотиристор (транзистор, симистор) любые какие только нужны))
    и самое главное, термопара ТХК(хром-копель)



    суть в том что у меняя есть три порога включения тенов,
    каждый из них содержит 12 тенов. (380в 2.2 Квт=1 тен)
    нужно собрать термометр с 4мя кнопками.
    1- пуск\стоп
    2- настройка (возможно он не нужен, но скорее всего пригодиться для сохранения)
    3- +
    4- -


    Температурный датчик, дает напряжение от 0 до 20 миливольт.
    необходима открытая установка температуры. То есть, человек пришел нажал на кнопку настройка, при помощи + поднял его до 200,
    (с дисплейом проблем нет)
    текущее состояние к примеру 100, он должен расчитать что это большое отклонение, и включить все тены по этапно с задержкой 3-4 сек, и смотреть за изменением, например при достижении 185 отключить одну группу, и снова смотреть, при достижении 195 отключить 2 группу, и при достижении 200 отключить 3, и снова смотреть за ситуацией, по инерции температура уйдет почти на 10 градусов,
    теперь при снижении от 200 градусов на 1 градус, должна включиться одна группа, если начнется подъем до 200, то выключиться она, если пойдет на снижение на 5 градусов, включается 2 группа, пойдет вверх, выключаются оба,




    ну я думаю смысл понятен((( это очень сложно конечно, но может кто поможет мне с этим. Или можно сделать вариант при помощи тиристоров, из трех групп тенов, сделать одну и посадить на парно-противополжные тиристоры(симисторы) чтоб пропускали синусоиду. и управлять при помощи аналогового выхода? у меня голова не варит вообще в этих исходниках((
     
  2. Unixon

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

    На счет языка C и вашего примера.
    С помощью циклов его можно сократить до такого:

    Код (Text):
    const int PIN_LED1 = 6;
    const int MAX_LEVEL = 255;
    const int STEP = 25;
    const int DURATION = 300;
     
    void setup()
    {
    pinMode(PIN_LED1, OUTPUT);
    pinMode(PIN_LED2, OUTPUT);
    }
     
    void loop()
    {
     for (int level = 0; level < MAX_LEVEL; level += STEP)
     {
      analogWrite(PIN_LED1, level);
      delay(DURATION);
     }
     if (MAX_LEVEL % STEP)
     {
      analogWrite(PIN_LED1, MAX_LEVEL);
      delay(DURATION);
     }
     for (int level = MAX_LEVEL-STEP; level > 0; level -= STEP)
     {
      analogWrite(PIN_LED1, level);
      delay(DURATION);
     }
     if (MAX_LEVEL % STEP)
     {
      analogWrite(PIN_LED1, 0);
      delay(DURATION);
     }
    }
     
     
  3. Unixon

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

    Теперь по сути вашей задачи.
    Как вы реализуете управление нагрузкой - через какие ключи - дело десятое, программа управления от этого в общем случае зависеть не будет. По выходу между силовой частью и логикой у вас будет цифровой интерфейс с 5V TTL/CMOS уровнями. По входу - найдите подходящий ОУ и через него гоните сигнал с термопары на встроенный АЦП (пины A0-A5). Останется только как-то откалибровать термопару.

    А управляющая программа у вас будет представлять разновидность конечного автомата. Почитайте раздел "Программирование" на Вики. Если останется слишком много вопросов - тогда снова сюда, будем писать код.
     
  4. MeDiAtoR

    MeDiAtoR Нуб

    Спасибо большое)) вы разгрузили память на 1 кб)) и светодиодик работает идеально)
    Но, я на счет конечных автоматов не очень понял... Это что мне даст? Я могу при помощи создать меню для для настройки (уставки ) температуры?
    Тут я закинул фотки. Те которые с китайскими рт и рв, это моих рук дела. По схеме которую тоже сам начертил когдато))
    вот его хотел как то модернизировать. Я собрал в принципе на ПЛК, на языке FBD, но мне интерес сам язык и процесс его работы. Тут же есть контроллер заводского производителя. Иногда сгорают они окончательно, приходиться менять на самоделки
     

    Вложения:

    • 404185096.jpeg
      404185096.jpeg
      Размер файла:
      185,9 КБ
      Просмотров:
      553
    • 404185087.jpeg
      404185087.jpeg
      Размер файла:
      74,4 КБ
      Просмотров:
      370
    • 404185070.jpeg
      404185070.jpeg
      Размер файла:
      79 КБ
      Просмотров:
      577
    • 404185122.jpeg
      404185122.jpeg
      Размер файла:
      65,9 КБ
      Просмотров:
      294
  5. Unixon

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

    Это просто стандартный систематизированный подход к проектированию поведения объекта.
    Т.е. вы должны прописать внутреннюю логику работы устройства не в виде описания его работы в свободной форме, а в виде совокупности правил строго определенной структуры (текущее состояние+событие => действие+новое состояние).
     
  6. MeDiAtoR

    MeDiAtoR Нуб

    а, ну это да, алгоритм просто так не зальёшь, нужно правильно составить.. Просто я не могу написать это на языке С, единственный язык который я знаю более менее это HTML. когда то все теги наизусть знал)). Обыскал все книжные магазины. Нет ничего подобного. Купил несколько книг для работы с ардуино, железную часть его понял, и принцип работы чуть чуть понял. Но нет описания всех этих кодов.
    Для обучения у меня было руководство по тегам на HTML
    например. :
    <body> начало тела документа, тут прописывается исходный код страницы, после окончания оформления требует закрытие при помощи </body>
    при помощи добавления параметра bgcolor <body bgcolor="yellow"> объявляется цвет тела документа, фона (backgraund) в данном случае желтый.
    <center>расположение текста, объекта по центру по горизонтали. этот текст находиться по центру. Требует закрытие</center>

    возможно это не самый умный подход к изучению языка, но мне так было проще запоминать... сейчас изучаю английский. хочу конкретно вникнуть в среду программирования. суть не в самом проекте, просто там логически не простое задание нужно сделать. Может сделав это я столкнусь с кучей неприятностей(чего просто обожаю) и научусь большему.
    может вы встречались с таким руководством?((
    ни гугл ни я.ру не помогают мне в этом. А диск который купил у артема кашеварова (обучение С++ с нуля) покарябан маленько. Не считывается( за него отдал 7500 рублей(( а времени все не было, а теперь изучать его нет смысла. так как на ардуино не видел я схожих команд как на С++ ну кроме объявления int\include
    Спасибо за помощь...
     
  7. Unixon

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

    Если честно как-то не было необходимости... я уже и не помню как и с чего начинал, а сейчас уже только в справочники иногда подглядываю.

    Ужас какой... 7500р... за эти деньги можно взять все самые важные книжки от основ самого языка до искусства построения алгоритмов. Нужно мне будет на озоне ссылки поискать на книжки из своей библиотеки, но это немного позже.

    По поводу программирования Ардуино. Пишите вы по сути на C++, а то, что называется Wiring - это библиотека для удобной работы с МК. Пусть вас не смущает, что вместо функции main() есть setup() и loop(). На деле скетч не является самостоятельной программой, а включается в стандартный шаблон программы в виде фрагмента. От пользователя эти детали скрыты Arduino IDE, но в принципе вам никто не запрещает использовать любую другую IDE с библиотекой Wiring, разве что последовательность команд компиляции и заливки кода в МК придется самому настроить. Главное, что вы должны понять - вы пишите на самом обычном C/C++. Некоторые отличия будут в составе стандартной библиотеки C/C++, но поначалу на это можно не обращать внимания.