#1 Re: Проекти » Требуется помощь в создании контроллера для пеллетной горелки » 2017-03-17 19:56:22

Вячеслав Азаров пише:

Могу вам помочь, профессионально. slavaza63@gmail.com

Слава, вы и мне позвоните, у нас с Алексом, судя по всему, одна тематика.

#2 Re: Проекти » Блок управления Пиролизным котлом » 2017-03-17 19:53:13

Вячеслав Азаров пише:

Я могу вам помочь, разобраться с этим "Мега" сервером. Не даром, конечно.

А мне "даром" и не нужно. Позвоните мне 0675090905 и попытаемся договориться.

#3 Re: Проекти » Закажу прект » 2017-03-17 18:54:31

Вячеслав Азаров пише:

Заказывайте мне. slavaza63@gmail.com

Я бы хотел сначала поговорить по телефону, прежде чем писать ТЗ.

#4 Re: Проекти » Закажу прект » 2017-03-17 18:52:56

Lic Control пише:

Мы разработали универсальный контроллер на базе Raspberry /Orange Pi. Один из таких контроллеров установили на реально работающую топочную на газовом котле. Не вижу препятствий для применения его на пеллетном котле. Посмотрите сайт. Здесь описание и адрес почты. Если интересно,  пишите.

Уже видел и даже Вам в личку написал.

#5 Re: Проекти » Закажу прект » 2017-03-17 18:51:43

NoName пише:

привет,
опыт подсказывает  - сделайте предпочтение местным разработчикам )
это плохо когда через границу нужно пересылать комплектуюшие

собственно заказчик в каких краях обитает?
предварительное ТЗ  готово?

Так в Украине и обитаем. Лично я в Киевской области, между Киевом и Борисполем.

#6 Проекти » Закажу прект » 2017-03-13 12:47:42

glory24
відповідей: 6

Нужно разработать, изготавливать и поставлять блок управления системой отопления на базе твердотопливного котла.
Блок нужен изготовителю этих котлов.
мой т. 0675090905 Вячеслав

#7 Re: Програмування Arduino » Arduino Stm Avr FPGA.Заказ электроники и скетчей » 2017-03-13 12:45:10

По  телефону общаетесь? Нужно разработать, изготавливать и поставлять блок управления системой отопления на базе твердотопливного котла для изготовителя этих котлов.
мой т. 0675090905 Вячеслав

#9 Проекти » Блок управления Пиролизным котлом » 2017-03-11 15:58:27

glory24
відповідей: 2

Имею такой вот блок управления Твердотопливным котлом.
В его состав входят Arduino Mega 2560 + Ethernet Shield W5100 +microSD
в общем все "что доктор прописал"
Кроме этого есть
Графический дисплей QC12864B
Усилитель термопары MAX31855
Датчик температуры DS18B20
4-канальный реле модуль
Как в данный момент функционирует блок можно почитать тут.
Данные с датчиков температуры блок отправляет сейчас на сторонний сервер
Требуется:
разобраться, как функционирует этот могучий инструмент (Ардуино Мега Сервер) и вывести показания с этих датчиков на AMS в виде аналогичных графиков с сохранением функционала блока, то есть не отправлять данные на xively.com, а формировать графики на SD карточке и просматривать их через браузер.
Я сам с этим справится не смог.
Скетч в виде кода прикрепить не могу, так как он слишком длинный, поэтому креплю его библиотеки в виде .zip

#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>
#include <OneWire.h>
#include "U8glib.h"
//+vasko 150224
#include "Adafruit_MAX31855.h"

// назначаем выходы Ардуино для взаимодействия с MAX31855
#define thermoDO  34
#define thermoCS  38
#define thermoCLK 36
Adafruit_MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);
//-vasko 150224

// закрепляем за оборудованием цифровые выходы ардуино 
#define nasosKranKotel 47     // Реле 1 - верхнее - НЦ1, КЭ1 47
#define nasosPotrebiteli 48   // Реле не присвоено - НЦ2, НЦ3, НЦ4 48
#define dymosos 44            // Реле 2 - второе сверху - Дымосос 44
#define kranTA 45             // Реле 3 - третье сверху - КЭ2 45
#define zaslonkaVozduha 46    // Реле 4 - нижнее - МЗ 46
//#define txa 8 // Аналоговый вход A8 ТХА (Датчик термопары дыма).

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//-----
IPAddress ip(192,168,0,20);
char xivelyKey[] = "yxLIRTV1LH6WAR52rvLSsXDidl7sGgN0efvah8hr0461";// Идентификатор на 
unsigned long feedId = 192768;// xively
//---------------------------------------------
//IPAddress ip(192,168,0,21);
//char xivelyKey[] = "8kSv3fJUP6SrrlEbCZvKZWI6NNCdbWAZj3PTTuiof9i";
//unsigned long feedId = 556923;
//----------------------------------------------------
// присваеваем типы значений числовым переменным
// присваеваем тип значения переменной для темп. сенсоров - char
char sensor1Id[] = "1_Dymovaya_Truba"; // ТХА
char sensor2Id[] = "2_Kotel_Vyhod";    // ДТ2
char sensor3Id[] = "3_Kotel_Obratka";  // ДТ3
char sensor4Id[] = "4_Verh_TA";        // ДТ4
char sensor5Id[] = "5_Niz_TA";         // ДТ5
char sensor0Id[] = "6_Test_Sensor";

XivelyDatastream datastreams[] = {
  XivelyDatastream(sensor0Id, strlen(sensor0Id), DATASTREAM_FLOAT),   
  XivelyDatastream(sensor1Id, strlen(sensor1Id), DATASTREAM_FLOAT),
  XivelyDatastream(sensor2Id, strlen(sensor2Id), DATASTREAM_FLOAT),
  XivelyDatastream(sensor3Id, strlen(sensor3Id), DATASTREAM_FLOAT),
  XivelyDatastream(sensor4Id, strlen(sensor4Id), DATASTREAM_FLOAT),
  XivelyDatastream(sensor5Id, strlen(sensor5Id), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(feedId, datastreams, 6/* number of datastreams */);// назначаем выходы Ардуино для взаимодействия с дисплеем

EthernetClient client;
XivelyClient xivelyclient(client);

// назначаем выходы Ардуино для взаимодействия с дисплеем
U8GLIB_ST7920_128X64_1X u8g(24, 22, 23);	// SPI Com: SCK = en = 24, MOSI = rw = 22, CS = di = 23
// Кроме этого GND на (VSS, K(BLK) и PSB), +5В на (VDD и А(BLA))

//int tempCelsVal[6], tempCelsPre[6], txaCode;
// присваеваем тип значения переменной для термопары - int
int txaCode;
// присваеваем тип значения переменной для термопары - float
float tempCels[6], txaTemp;
// присваеваем тип значения переменной для описывающей состояние Отопительной системы - boolean
boolean reactorActive=0, accumulatorWarm=0, systemCRIHot=0, systemVeryHot=0, dymVeryCold=0, postplenieGar=0, sensorOnline[5];
// закрепляем входы Ардуино за датчиками температуры в СО
OneWire  ds1(28); // Неиспользуемый датчик 
OneWire  ds2(29); // Температура воды Котел подача  ДТ2
OneWire  ds3(30); // Температура воды Котел обратка ДТ3
OneWire  ds4(27); // Температура воды ТА Верхняя часть ДТ4
OneWire  ds5(31); // Температура воды ТА Нижняя  часть ДТ5
//----------------------------------------
// Графика дисплея
void draw(void) 
{
  u8g.setFont(u8g_font_freedoomr10r);
  //-------------------Котел Подача--------------
  u8g.drawFrame(0,15,33,48); // прямоугольник корпуса котла
  tempOutGraph(2,3,32); // Определяет положение индикации  ds2 "Температура воды Котел подача  ДТ2"
  u8g.drawVLine(25,0,15); // труба дымовая левая часть 
  u8g.drawVLine(29,0,15); // труба дымовая правая часть
  if (!digitalRead(zaslonkaVozduha)) 
  {
    u8g.drawLine(24,9,30,3);
  } // вывод изображения заслонки, если она включена (закрыта)

  //-------------------Аккумулятор Верх--------
  u8g.drawEllipse(67,32,4,10,U8G_DRAW_UPPER_LEFT|U8G_DRAW_LOWER_LEFT);
  u8g.drawEllipse(110,32,4,10);
  u8g.drawHLine(69,21,41); // верхняя линия
  u8g.drawHLine(69,42,41); // нижняя линия
  tempOutGraph(4,85,20); // Определяет положение индикации  ds4 "Температура воды ТА Верхняя часть ДТ4" 
  // (№ датчика темп.,x,y)
  //----------------Аккумулятор Низ----------
  tempOutGraph(5,85,59); // Определяет положение индикации  ds5 "Температура воды ТА Нижняя  часть ДТ5"
  //--------------------Трубы-------------

  u8g.drawHLine(33,17,16); // выход котла
  u8g.drawHLine(33,48,16); // вход котла
  u8g.drawFrame(49,0,79,64); // рамка СО
  u8g.drawVLine(78,42,22); // выход аккумулятора
  u8g.drawVLine(78,2,20); // вход аккумулятора 
  u8g.drawDisc(126,26,3); // насос система
  u8g.drawDisc(49,48,3); // насос обратка 
  //-------------
   tempOutGraph(3,3,62); // Определяет положение индикации  ds3  "Температура воды Котел обратка ДТ3"
  //--------------------------------------
   if (!digitalRead(nasosPotrebiteli)) // Если включен насос СО
  { // оператор (!) перд digitalRead обеспечивает правильное положенеи контактов рере соответствующее работе светодиода
    u8g.drawVLine(120,25,12); // стрелка после насоса системы (x,y,длина лин.)(119,37,12)
    u8g.drawLine(120,39,118,34);// наконечник стрелки (Х,У,х-коца линии наконечника,у-конец лин. нак.) (119,49,117,47)
    u8g.drawLine(120,39,122,34);
  }
    //---------------------------
  if (!digitalRead(nasosKranKotel)) // Если включены кран и насос Котла
  { // оператор (!) перд digitalRead обеспечивает правильное положенеи котактов рере соответствующее работе светодиода
    u8g.drawHLine(39,21,6); 
    u8g.drawVLine(44,21,10);  // обратка
    u8g.drawHLine(39,31,6);
    u8g.drawLine(39,31,41,29);
    u8g.drawLine(39,31,41,33); 
 
    u8g.drawVLine(46,3,12); // выход в систему
    u8g.drawLine(46,3,44,5);
    u8g.drawLine(46,3,48,5);
      //------------
    u8g.drawHLine(54,5,11); // стрелка перед краном ТА
    u8g.drawLine(68,5,63,3);
    u8g.drawLine(68,5,63,7);
      //------------
    u8g.drawHLine(54,58,12); // стрелка на вход в котел (x,y,длина линии) drawHLine-горизонтальная
    u8g.drawLine(51,58,55,56); // перед краном котла линия по 2-м точкам (х,у,х,у)
    u8g.drawLine(51,58,55,60);
  }
   //-------------
   if (digitalRead(nasosKranKotel))// Kран котла закрыт (Рисуем крестик на трубе)
  {  
    u8g.drawLine(40,46,36,50);// кран котла 1-я линия (Х,У,х-коца линии,у-конца линии)
    u8g.drawLine(40,50,36,46);// кран котла 2-я линия (Х,У,х-коца линии,у-конца линии)
  }   
      //-------------
   if (!digitalRead(kranTA) && !digitalRead(nasosKranKotel)) // Если открыт кран ТА и включены кран и насос Котла 
  { // рисуем Стрелку в ТА
    u8g.drawVLine(73,6,10); // стрелка ТА drawVLine-вертикальная
    u8g.drawLine(75,13,73,18);
    u8g.drawLine(71,13,73,18);// (Х,У,х-коца линии наконечника,у-конец лин. нак.)
  }  
  if (!digitalRead(kranTA) && digitalRead(nasosKranKotel))// Если открыт кран ТА и вЫключены кран и насос Котл
  { // рисуем Стрелку выход из ТА
    u8g.drawVLine(73,6,10); // стрелка ТА drawVLine-вертикальная
    u8g.drawLine(73,3,71,8);
    u8g.drawLine(73,3,75,8);// (Х,У,х-коца линии наконечника,у-конец лин. нак.)
  } 
   if (digitalRead(kranTA))// Если закрыт кран ТА
  {
    u8g.drawLine(80,7,76,11);// кран ТА 1-я линия (Х,У,х-коца линии,у-конца линии)
    u8g.drawLine(76,7,80,11);// кран ТА 2-я линия (Х,У,х-коца линии,у-конца линии)   
  }
  //-------------------------------------- 
  u8g.setPrintPos(0, 12); // Вывод показаний датчика 
  u8g.print((int)txaTemp); // температуры дыма
  
  //--------------------------------------   
}
//----------------------------------------
// Определение первоначальных состояний цифровым выходам  
void setup()
{ 
  pinMode(zaslonkaVozduha, OUTPUT); // Назначаем порт "Выходом"
  pinMode(kranTA, OUTPUT); // Назначаем порт "Выходом"
  //pinMode(nasosPotrebiteli, OUTPUT); // Назначаем порт "Выходом"
  pinMode(dymosos, OUTPUT); // Назначаем порт "Выходом"
  pinMode(nasosKranKotel, OUTPUT); // Назначаем порт "Выходом"
  digitalWrite(zaslonkaVozduha, HIGH); // Назначаем первичное состояние ячейки Воздушой заслонки "HIGH" - подача воздуха закрыта
  digitalWrite(kranTA, LOW); // Назначаем первичное состояние ячейки Крана ТА "HIGH"
  //digitalWrite(nasosPotrebiteli, HIGH); // Назначаем первичное состояние ячейки Насос потребители "HIGH"
  digitalWrite(dymosos, HIGH); // Назначаем первичное состояние ячейки Дымососа "HIGH"
  digitalWrite(nasosKranKotel, LOW); // Назначаем первичное состояние ячейки Насоса и крана котла "HIGH"
  u8g.setRot180();
  u8g.setColorIndex(1);         // pixel on
  Serial.begin(9600);
  Serial.println("Starting single datastream upload to Xively...");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Ошибка DHCP, установка стандартного IP-адреса 
    Ethernet.begin(mac, ip);
  }
  Serial.print("IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++)
  {
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  } 
  Serial.println();
  Serial.println();
} 
//----------------------------------------
//Циклически исполняемая программа
//----------------------------------------
void loop()
{
  //+vasko 150224
  //txaCode=analogRead(8); // считывание показаний ТХА (код от 0 до 1023, 4.9 мВ/ед)
  //txaTemp=txaCode*1.0+1; // вычисление температуры дыма и добавление примерной температуры холодного спая 1 гр.С
  txaTemp= thermocouple.readCelsius()+0.5;  // 0.5 поправочное значение
  //-vasko 150224

  tempCels[1] = txaTemp;
  sendToXively(1);
  secondSensorInquiry(2);// Считывает показания с sensor2Id[]
  temperaturePrint(2);// Пишет на дисплее показания sensor2Id[]
  sendToXively(2);// Отправляет на Xively показания sensor2Id[]
  thirdSensorInquiry(3);// Считывает показания с sensor3Id[]
  temperaturePrint(3);//// Пишет на дисплее показания sensor3Id[
  sendToXively(3);//Отправляет на Xively показания sensor3Id[]
  fourthSensorInquiry(4);// Считывает показания с sensor4Id[]
  temperaturePrint(4); // Пишет на дисплее показания sensor4Id[]
  sendToXively(4);//Отправляет на Xively показания sensor4Id[]
  fifthSensorInquiry(5);// Считывает показания с sensor5Id[] 
  temperaturePrint(5);// Пишет на дисплее показания sensor5Id[]
  sendToXively(5);//Отправляет на Xively показания sensor5Id[]
  Serial.print("Smoke temp:");
  Serial.println(txaTemp);
  //-----------------------------
  // Условия определяющие состояние Котла -reactorActive-
  //--------------------------------------
  if (tempCels[2] > 95 || txaTemp > 109){ // если температура воды
    reactorActive=1;//на выходе из котла более 95 градусов или дыма более 109 (105) градусов  
  } 
  if (tempCels[2] < 94 && txaTemp < 108){ // если  температура воды менее 94 и
    reactorActive=0;//  температура дыма менее 108 (100) град. С
  }  
  //-----------------------------
  // Условия определяющие состояние ТА при разборе с него тепла
  //-----------------------------------
  if (tempCels[4] > 28){ // есть ли в аккумуляторе тепло (больше чем 27С)
    accumulatorWarm=1;
  }
  if (tempCels[4] <28){ // есть ли в аккумуляторе холодно (мньше чем 27С)
    accumulatorWarm=0;
  }
  //-----------------------------
  // Условие определяющее состояние Заслонки Дыма при перегреве котла
  //-----------------------------
  if (tempCels[2] > 96){ // если котел нагрет, более 96 градусов
    systemCRIHot=1;
  }
  if (tempCels[2] < 95){ // если котел нагрет, менее 95 градусов
    systemCRIHot=0;
  }
  //-----------------------------
  // Условие определяющее подпитку Котла водой из ТА
  //-----------------------------
  if (tempCels[2] > 85){ // если температура котла более 85 градусов
    systemVeryHot=1;
  }
  if (tempCels[2] < 85){ // если температура котла меньше 84 градусов
    systemVeryHot=0;
  }
  //---------------------
  // Порядок работы СО в период работы котла (reactorActive)
  //----------------------
   if (reactorActive)
{
    on(nasosKranKotel);
    // Условие открытия кран ТА по перегреву
    if (systemVeryHot) 
    { 
      on(kranTA); // в случае нагрева котла до 85 градусов открыть кран подачи в ТА
    } 
    else 
    { 
      off(kranTA); 
    }
      // Условия работы дымососа
    if (txaTemp < 112) // Температура дыма меньше 112 градусов
    { 
      //on(zaslonkaVozduha);// Закроет заслонку дым трубы, 
      on(dymosos);// включит мотор дымососа;  
    } 
    if (txaTemp > 125) // Температура дыма больше 125 градусов
    { 
      off(dymosos);// остановит мотор дымососа
      //off(zaslonkaVozduha);// Откроет заслонку дым. трубы
    } 
      // Условие работы звслонки дыма и дымососа при перегреве котла выше 95 гр.
    if (systemCRIHot) // Если котел перегрет более 95 градусов
    { 
      on(zaslonkaVozduha);// Закроет заслонку дым трубы, остановить подачу воздуха в котел
      off(dymosos);// остановит мотор дымососа;
    } 
    else 
    {
     off (zaslonkaVozduha);// откроет подачу воздуха в котел
    }   
}
  else 
{
    off(nasosKranKotel); // Остановлен насос котла, закрыт кран котла
    on(zaslonkaVozduha); // остановить подачу воздуха в котел
    off(dymosos);
    if (accumulatorWarm) 
    { // если в аккумуляторе есть тепло
      on(kranTA); // обогрев  
      delay (1000); // от
      on(nasosPotrebiteli);  // ТА
    } 
    else 
    {
      off(nasosPotrebiteli);
      delay (1000);
      off(kranTA);
    }
}
  //-----------------------------
  u8g.firstPage();  
  do {
    draw();
  } 
  while( u8g.nextPage() );
  delay(100);// 300
  //-----------------------------
}
//-----------------------------
void sendToXively(byte sensorNumber) 
{
  datastreams[sensorNumber].setFloat(tempCels[sensorNumber]);
  Serial.print("Sensor ");
  Serial.print(sensorNumber);
  Serial.print(" value is: ");
  Serial.print(datastreams[sensorNumber].getFloat());
  Serial.print("  Sending...  ");
  int ret = xivelyclient.put(feed, xivelyKey);
  Serial.print("xivelyclient.put returned ");
  Serial.println(ret);
} 
//-----------------------------
/*void firstSensorInquiry(byte sensorNumber)
 {
 byte i;  
 byte ram[12];
 byte rom[8];
 float temp;
 int divider;   
 ds1.reset_search();
 if ( !ds1.search(rom)) {
 sensorOnline[sensorNumber] = 0;
 tempCels[sensorNumber]=0;}// если не включен- задает значение ноль
 else {
 sensorOnline[sensorNumber] = 1;    
 ds1.reset();
 ds1.select(rom);
 ds1.write(0x44, 1);     
 delay(900);
 ds1.reset();
 ds1.select(rom);    
 ds1.write(0xBE);
 for ( i = 0; i < 9; i++) {  
 ram[i] = ds1.read();}
 crcTest(rom, ram, sensorNumber);
 divider = sensorType(rom[0]);   
 temp=(ram[1]<<8)+ram[0];
 tempCels[sensorNumber] = temp/divider;
 }
 return;
 }  */
//-----------------------------
void secondSensorInquiry(byte sensorNumber)
{
  byte i;  
  byte ram[12];
  byte rom[8];
  float temp;
  int divider;  
  ds2.reset_search();
  if ( !ds2.search(rom)) {
    sensorOnline[sensorNumber] = 0;
    tempCels[sensorNumber]=0;
  }// если не включен- задает значение ноль
  else {
    sensorOnline[sensorNumber] = 1;    
    ds2.reset();
    ds2.select(rom);
    ds2.write(0x44, 1);     
    delay(800);// 900
    ds2.reset();
    ds2.select(rom);    
    ds2.write(0xBE);
    for ( i = 0; i < 9; i++) {  
      ram[i] = ds2.read();
    }
    crcTest(rom, ram, sensorNumber);      
    divider = sensorType(rom[0]);
    temp=(ram[1]<<8)+ram[0];
    tempCels[sensorNumber] = temp/divider;
  }
  return;
}  
//-----------------------------
void thirdSensorInquiry(byte sensorNumber)
{
  byte i;  
  byte ram[12];
  byte rom[8];
  float temp;
  int divider;   
  ds3.reset_search();
  if ( !ds3.search(rom)) {
    sensorOnline[sensorNumber] = 0;
    tempCels[sensorNumber]=0;
  }// если не включен- задает значение ноль
  else {
    sensorOnline[sensorNumber] = 1;    
    ds3.reset();
    ds3.select(rom);
    ds3.write(0x44, 1);     
    delay(800); // 900
    ds3.reset();
    ds3.select(rom);    
    ds3.write(0xBE);
    for ( i = 0; i < 9; i++) {  
      ram[i] = ds3.read();
    }
    crcTest(rom, ram, sensorNumber);
    divider = sensorType(rom[0]);   
    temp=(ram[1]<<8)+ram[0];
    tempCels[sensorNumber] = temp/divider;
  }
  return;
}  
//-----------------------------
void fourthSensorInquiry(byte sensorNumber)
{
  byte i;  
  byte ram[12];
  byte rom[8];
  float temp;
  int divider;   
  ds4.reset_search();
  if ( !ds4.search(rom)) {
    sensorOnline[sensorNumber] = 0;
    tempCels[sensorNumber]=0;
  }// если не включен- задает значение ноль
  else {
    sensorOnline[sensorNumber] = 1;    
    ds4.reset();
    ds4.select(rom);
    ds4.write(0x44, 1);     
    delay(800); // 900
    ds4.reset();
    ds4.select(rom);    
    ds4.write(0xBE);
    for ( i = 0; i < 9; i++) {  
      ram[i] = ds4.read();
    }
    crcTest(rom, ram, sensorNumber); 
    divider = sensorType(rom[0]);   
    temp=(ram[1]<<8)+ram[0];
    tempCels[sensorNumber] = temp/divider;
  }
  return;
}
//-----------------------------
void fifthSensorInquiry(byte sensorNumber)
{
  byte i;  
  byte ram[12];
  byte rom[8];
  float temp;
  int divider;   
  ds5.reset_search();
  if ( !ds5.search(rom)) {
    sensorOnline[sensorNumber] = 0;
    tempCels[sensorNumber]=0;
  } // если не включен- задает значение ноль
  else {
    sensorOnline[sensorNumber] = 1;    
    ds5.reset();
    ds5.select(rom);
    ds5.write(0x44, 1);     
    delay(800); //900
    ds5.reset();
    ds5.select(rom);    
    ds5.write(0xBE);
    for ( i = 0; i < 9; i++) {  
      ram[i] = ds5.read();
    }
    crcTest(rom, ram, sensorNumber);
    divider = sensorType(rom[0]);   
    temp=(ram[1]<<8)+ram[0];
    tempCels[sensorNumber] = temp/divider;
  }
  return;
}  
//-----------------------------
void crcTest(byte romCode[8], byte ramCode[12], byte sensorNumber)
{
  if ( OneWire::crc8(romCode, 7) == romCode[7] && OneWire::crc8(ramCode, 8)== ramCode[8] ){
    Serial.print("CRC-");
    Serial.print(sensorNumber);
    Serial.print(" OK.");
    return;
  }
  else {   
    Serial.print("CRC-");
    Serial.print(sensorNumber);
    Serial.print(" ERROR!");
    sensorOnline[sensorNumber] = 0; 
    return;
  }   
}
//-----------------------------
int sensorType(byte serCode)
{
  if ( serCode == 0x10) {
    Serial.print("Sensor is 18S20.");
    return 2;
  }
  if ( serCode == 0x28) {
    Serial.print("Sensor is 18B20.");
    return 16;
  }
}  
//----------------------------- 
void temperaturePrint(int sensorNumber)
{
  if (sensorOnline[sensorNumber]) {  
    Serial.print("Temp ");
    Serial.print(sensorNumber);
    Serial.print(" is ");
    Serial.print(tempCels[sensorNumber],2);
    Serial.print("C.\n");
  } 
  else { 
    Serial.print("Sensor ");
    Serial.print(sensorNumber);
    Serial.print(" not connected\n");
    delay (200); // 200
  }
  return;
}  
//----------------------------- 
void on (int relay)
{
  digitalWrite(relay, LOW);  
}
//----------------------------- 
void off (int relay)
{
  digitalWrite(relay, HIGH);  
}
//----------------------------- 
void tempOutGraph(int sensor, int x, int y)
{
  if (sensorOnline[sensor]){
    u8g.setPrintPos(x, y);
    u8g.print(tempCels[sensor],1);
  }
  else {
    u8g.drawStr(x+7, y, "NC");
  }  
}  

#10 Програмування Arduino » mega 2560+drv8825+ETHER_28J60 » 2017-01-06 17:54:59

glory24
відповідей: 0

Пытаюсь наладить управление шаговым двигателем через локальную сеть.
За основу взял это проект
Скетч для управления шагового двигателя вот

#include <Arduino.h>
#include "BasicStepperDriver.h"

#define MOTOR_STEPS 200
#define DIR 34
#define STEP 33
#define MICROSTEPS 1
BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP);

void setup() {
    
    stepper.setRPM(120);// скорость вращения
}

void loop() {
  
    stepper.setMicrostep(MICROSTEPS);
    
    stepper.rotate(3600);// Угол поворота
  
    delay(3000);
}

Скетч для управления Мегой через ETHER_28J60 вот

/*В библиотке ETHER28J60 в  файле ETHER_28J60.cpp изменил строки
  *#define BUFFER_SIZE 2000
  *#define STR_BUFFER_SIZE 64
 *В библиотке etherShield в файле enc28j60.c изменил строки
  #define ENC28J60_CONTROL_CS     53 // 10
  #define SPI_MOSI		51 //11
  #define SPI_MISO		50 //12
  #define SPI_SCK		52 //13
  инструкция http://arduino-project.net/podklyuchenie-enc28j60-arduino-mega-2560/
  
*/
#include "etherShield.h"
#include "ETHER_28J60.h"
 
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   
static uint8_t ip[4] = {192, 168, 0, 222};                       
static uint16_t port = 80;   
 
ETHER_28J60 ethernet;
int outputPin3 = 13;
int outputPin = 11;
int outputPin2 = 12;
 
void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(outputPin, OUTPUT);
  pinMode(outputPin2, OUTPUT);
  pinMode(outputPin3, OUTPUT);
}
 
void loop()
{
 
  char* params;
  if (params = ethernet.serviceRequest())
  {
    ethernet.print("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
    ethernet.print("<img src='https://a.pololu-files.com/picture/0J4124.600.png?91f6a95b143bbb0f34f82c30a47fcced'><p></p>");
    ethernet.print("<a href='?cmd=on1' >Включить L1</a><p></p>");
    ethernet.print("<a href='?cmd=off1' >Отключить L1</a><p></p>");
    ethernet.print("<a href='?cmd=on2' >Включить L2</a><p></p>");
    ethernet.print("<a href='?cmd=off2' >Отключить L2</a><p></p>");
    ethernet.print("<a href='?cmd=on3' >Включить L3</a><p></p>");
    ethernet.print("<a href='?cmd=off3' >Отключить L3</a><p></p>");
    ethernet.print("<a href='?cmd=on' >Включить все</a><p></p>");
    ethernet.print("<a href='?cmd=off' >Отключить все</a><p></p>");
    ethernet.respond();
    if (strcmp(params, "?cmd=on1") == 0){digitalWrite(outputPin, HIGH);}
    if (strcmp(params, "?cmd=off1") == 0){digitalWrite(outputPin, LOW);}
    if (strcmp(params, "?cmd=on2") == 0){digitalWrite(outputPin2, HIGH);}
    if (strcmp(params, "?cmd=off2") == 0){digitalWrite(outputPin2, LOW);}
    if (strcmp(params, "?cmd=on3") == 0){digitalWrite(outputPin3, HIGH);}
    if (strcmp(params, "?cmd=off3") == 0){digitalWrite(outputPin3, LOW);}
    if (strcmp(params, "?cmd=on") == 0){digitalWrite(outputPin, HIGH);digitalWrite(outputPin2, HIGH);digitalWrite(outputPin3, HIGH);}
    if (strcmp(params, "?cmd=off") == 0){digitalWrite(outputPin, LOW);digitalWrite(outputPin2, LOW);digitalWrite(outputPin3, LOW);}
    }
  delay(100);
}

Дополняю его управлением шаговиком, получаю вот

#include "etherShield.h"
#include "ETHER_28J60.h"
//-----------------------------
#include <Arduino.h>
#include "BasicStepperDriver.h"
//--------------------------------
#define MOTOR_STEPS 200
#define DIR 34
#define STEP 33
#define MICROSTEPS 1
BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP);
//---------------------------------------------
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   
static uint8_t ip[4] = {192, 168, 0, 222};                       
static uint16_t port = 80;   
 
ETHER_28J60 ethernet;
int outputPin3 = 13;
int outputPin = 11;
int outputPin2 = 12;
 
void setup()
{ 
  ethernet.setup(mac, ip, port);
  pinMode(outputPin, OUTPUT);
  pinMode(outputPin2, OUTPUT);
  pinMode(outputPin3, OUTPUT);
  //------------------------------
 stepper.setRPM(120);// скорость вращения
  //-----------------------------------
}
 
void loop()
{
   
  char* params;
  if (params = ethernet.serviceRequest())
  {
    ethernet.print("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
    ethernet.print("<img src='http://wiki.mchobby.be/images/2/22/A4988-PinOut.jpg'><p></p>");
    ethernet.print("<a href='?cmd=on1' >Включить L1</a><p></p>");
    ethernet.print("<a href='?cmd=off1' >Отключить L1</a><p></p>");
    ethernet.print("<a href='?cmd=on2' >Включить L2</a><p></p>");
    ethernet.print("<a href='?cmd=off2' >Отключить L2</a><p></p>");
    ethernet.print("<a href='?cmd=on3' >Включить L3</a><p></p>");
    ethernet.print("<a href='?cmd=off3' >Отключить L3</a><p></p>");
    ethernet.print("<a href='?cmd=on' >Включить все</a><p></p>");
    ethernet.print("<a href='?cmd=off' >Отключить все</a><p></p>");
    ethernet.respond();
    if (strcmp(params, "?cmd=on1") == 0){
      digitalWrite(outputPin, HIGH);
      stepper.setMicrostep(MICROSTEPS);
      stepper.rotate(3600);// Поворачивает на угол
    }
    if (strcmp(params, "?cmd=off1") == 0){digitalWrite(outputPin, LOW);}
    if (strcmp(params, "?cmd=on2") == 0){digitalWrite(outputPin2, HIGH);}
    if (strcmp(params, "?cmd=off2") == 0){digitalWrite(outputPin2, LOW);}
    if (strcmp(params, "?cmd=on3") == 0){digitalWrite(outputPin3, HIGH);}
    if (strcmp(params, "?cmd=off3") == 0){digitalWrite(outputPin3, LOW);}
    if (strcmp(params, "?cmd=on") == 0){digitalWrite(outputPin, HIGH);digitalWrite(outputPin2, HIGH);digitalWrite(outputPin3, HIGH);}
    if (strcmp(params, "?cmd=off") == 0){digitalWrite(outputPin, LOW);digitalWrite(outputPin2, LOW);digitalWrite(outputPin3, LOW);}
    }

 
  delay(300);
}

Двигатель не вращается.
Что нужно поправить, что бы его запустить?

#11 Re: Програмування Arduino » ENC28J60 Ethernet модуль » 2017-01-06 10:34:55

Помогли, и все еще помогаете. Сегодня тоже с Вашей помощью поборол эту ошибку.  smile

#12 Re: Програмування Arduino » При компилировании выдает ошибку » 2017-01-05 22:10:43

qwone пише:
glory24 пише:

BasicStepperDriver.ino:12:32: error: BasicStepperDriver.h: No such file or directory

Название файла .ino и файла .h не должны совпадать.
No such file or directory - переводчик в руки- нет файла или директории.
А дальше следсвие.

Переназвал файл .ino, теперь ругается так:

BasicStepperDriver8825.ino:12:32: error: BasicStepperDriver.h: No such file or directory
BasicStepperDriver8825:28: error: 'BasicStepperDriver' does not name a type
BasicStepperDriver8825.ino: In function 'void setup()':
BasicStepperDriver8825:39: error: 'stepper' was not declared in this scope
BasicStepperDriver8825.ino: In function 'void loop()':

3d8wrMbkFnDtmJTF7

картинка открывается правой кнопкой мышки
вот код

/*
 * Simple demo, should work with any driver board
 *
 * Connect STEP, DIR as indicated
 *
 * Copyright (C)2015 Laurentiu Badea
 *
 * This file may be redistributed under the terms of the MIT license.
 * A copy of this license has been included with this distribution in the file LICENSE.
 */
#include <Arduino.h>
#include "BasicStepperDriver.h"

// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200

// All the wires needed for full functionality
#define DIR 9
#define STEP 8
//Uncomment line to use enable/disable functionality
//#define ENBL 7

// Since microstepping is set externally, make sure this matches the selected mode
// 1=full step, 2=half step etc.
#define MICROSTEPS 1

// 2-wire basic config, microstepping is hardwired on the driver
BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP);

//Uncomment line to use enable/disable functionality
//BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP, ENBL);

void setup() {
    /*
     * Set target motor RPM.
     * These motors can do up to about 200rpm.
     * Too high will result in a high pitched whine and the motor does not move.
     */
    stepper.setRPM(5);// скорость вращения
}

void loop() {
  
    // energize coils - the motor will hold position
    // stepper.enable();
  
    /*
     * Tell the driver the microstep level we selected.
     * If mismatched, the motor will move at a different RPM than chosen.
     */
    stepper.setMicrostep(MICROSTEPS);

    /*
     * Moving motor one full revolution using the degree notation
     */
    stepper.rotate(30);// Угол поворота

    /*
     * Moving motor to original position using steps
     */
   //stepper.move(-200*MICROSTEPS);// Возврат на 200 шагов

    // pause and allow the motor to be moved by hand
    // stepper.disable();

    delay(3000);
}

#14 Програмування Arduino » При компилировании выдает ошибку » 2017-01-05 18:26:47

glory24
відповідей: 3

BasicStepperDriver.ino:12:32: error: BasicStepperDriver.h: No such file or directory
BasicStepperDriver:28: error: 'BasicStepperDriver' does not name a type
BasicStepperDriver.ino: In function 'void setup()':
BasicStepperDriver:39: error: 'stepper' was not declared in this scope
BasicStepperDriver.ino: In function 'void loop()':
BasicStepperDriver:51: error: 'stepper' was not declared in this scope

Компилирую в Arduino 1.0.5
Скетч BasicStepperDriver из библиотеки StepperDriver
BasicStepperDriver.h как и положено лежит в папочке C:\Arduino\Arduino\libraries\StepperDriver\src


Ошибку выдает на эту строчку из скетча: BasicStepperDriver stepper(MOTOR_STEPS, DIR, STEP);

Этот же скетч в Arduino 1.6.12 проходит компиляцию без проблем
Как полечить Arduino 1.0.5 ?

Підвал форуму