Ви не увійшли.
Сторінки 1
Могу вам помочь, профессионально. slavaza63@gmail.com
Слава, вы и мне позвоните, у нас с Алексом, судя по всему, одна тематика.
Я могу вам помочь, разобраться с этим "Мега" сервером. Не даром, конечно.
А мне "даром" и не нужно. Позвоните мне 0675090905 и попытаемся договориться.
Заказывайте мне. slavaza63@gmail.com
Я бы хотел сначала поговорить по телефону, прежде чем писать ТЗ.
Мы разработали универсальный контроллер на базе Raspberry /Orange Pi. Один из таких контроллеров установили на реально работающую топочную на газовом котле. Не вижу препятствий для применения его на пеллетном котле. Посмотрите сайт. Здесь описание и адрес почты. Если интересно, пишите.
Уже видел и даже Вам в личку написал.
привет,
опыт подсказывает - сделайте предпочтение местным разработчикам )
это плохо когда через границу нужно пересылать комплектуюшиесобственно заказчик в каких краях обитает?
предварительное ТЗ готово?
Так в Украине и обитаем. Лично я в Киевской области, между Киевом и Борисполем.
Нужно разработать, изготавливать и поставлять блок управления системой отопления на базе твердотопливного котла.
Блок нужен изготовителю этих котлов.
мой т. 0675090905 Вячеслав
По телефону общаетесь? Нужно разработать, изготавливать и поставлять блок управления системой отопления на базе твердотопливного котла для изготовителя этих котлов.
мой т. 0675090905 Вячеслав
Константин, посмотрите пожалуйста, может сможете помочь.
Имею такой вот блок управления Твердотопливным котлом.
В его состав входят 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");
}
}
Пытаюсь наладить управление шаговым двигателем через локальную сеть.
За основу взял это проект
Скетч для управления шагового двигателя вот
#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);
}
Двигатель не вращается.
Что нужно поправить, что бы его запустить?
Помогли, и все еще помогаете. Сегодня тоже с Вашей помощью поборол эту ошибку.
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()':
картинка открывается правой кнопкой мышки
вот код
/*
* 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);
}
И я написал в личку
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 ?
Сторінки 1