Re: Мои проекты на Ардуино
Добавлено: 12 ноя 2012, 06:29
Статьи, обзоры, цены на станки и комплектующие.
https://www.cnc-club.ru/forum/
а они какието породистые, или уже "олл инклюзив" природой?aftaev писал(а):далее когда термофилы расплодились
это природа. от разны параметров таких как О2, рН, влажность температура будет зависить что вырастит нужные культуры иль не нужные.2cme писал(а):а они какието породистые, или уже "олл инклюзив" природой?
Ты точками рисуй. Будет быстрее.aftaev писал(а):Осциллограф чувствительный, но до 5в , но очень медлительный. Весь экран прорисовывается за 15 сек,
С начало сделал именно точками. Если точками, то график рваный получается при скачках напряжения и не понятно как напруга прыгала.Impartial писал(а):Ты точками рисуй. Будет быстрее.
А какой режим? Как ездит или какие то параметры дуги?aftaev писал(а):Мне нужно чтобы линия на экране Ардуины рисовалась примерно с той же скоростью что режим на плазме.
Пока занимаемся измерениями. Мне нужно было записывать вольты после делителя/фильтров и писать в файл чтобы посмотреть что происходит на краю листа, когда дуга через рез проходит, разный ток, разные расходники, старые/новые расходники итд..Impartial писал(а):А какой режим?
На портал прицепили и он таскает плазматрон. Испытываем на ровном и гнутом листе.Impartial писал(а):Как ездит или какие то параметры дуги?
Код: Выделить всё
#include <Adafruit_GFX.h> // Core graphics library
#include "SWTFT.h" // Hardware-specific library
#include <TimerOne.h> //используем Timer1 для прерываний по времени
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define DARKRED 0x2020
#define GREEN 0x07E0
#define DARKGREEN 0x2121
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
SWTFT tft;
int ACS712 = A8; // select the input pin for an ACS712-20
int Uopornoe;// = A15; // select the input pin for a reference voltage
const int k=160; // k - кол-во записей в массив.
const int numReadings = 30; // numReadings - кол-во данных в фильтре.
boolean trig, resize;
volatile long PintTic=0; // счетчик периодов
volatile int CurA0; // Ток текущий
volatile int CurA0max; // Ток маскимальный
volatile long CurA0calcMax; // Ток маскимальный за весь период
volatile int CurA0min; // Ток минимальный
volatile long CurA0calcMin; // Ток минимальный за весь период
volatile int ymax=256, ymin=-256; // значения для масштабирования графика и сетки
float CurA0calcMid; // Ток средний (среднеквадратичное от CurA0calcMax и CurA0calcMin)
volatile int val_a[501]; //Массив значений A0 в прерываниях
volatile int val_a2[501]; //Массив значений времени в прерываниях
volatile int val_Uo[501]; //Массив значений опорного напряжения прерываниях
volatile long val_t[501]; //Массив значений времени в прерываниях
volatile int nb[501]; //Массив для учета номера итерации
volatile int i, z, c, v;
int scr_out, x1=0, x2=1, y1=120, y2=120;
// Переменные для фильтра
float readings[numReadings]; // the readings from the analog input
float total = 0; // the running total
float average = 0; // the average
float A0_current;
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 6000; // interval at which to blink (milliseconds)
void setup(void) {
Serial.begin(9600); //поднимаем соединение для передачи на терминал
// Инициализация данных в массиве фильтра в 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++)
readings[thisReading] = 0;
tft.reset();
uint16_t identifier = tft.readID();
Serial.print(F("LCD driver chip: "));
Serial.println(identifier, HEX);
tft.begin(identifier);
tft.setRotation(1);
//рисуем сетку
Grid();
// Запуск таймера
Timer1.initialize(400); // Интервал срабатывания таймера в мкс
Timer1.attachInterrupt(current_meter); //будет вызываться каждый раз при отсчете заданного времени
}
void loop(void) {
// Закрашиваем чёрным предыдущее значение тока:
tft.setCursor(96, 4);
tft.setTextColor(BLACK); tft.setTextSize(1);
tft.println(A0_current,2);
tft.setCursor(222, 4);
tft.print(average,2);
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
Grid();
scr_out = 0;
x1=0; x2=1; y1=120,y2=120;
while (scr_out <= k) {
// Ноль координат - в верхнем левом углу экрана!!! Вынос мозга...
y2 = map(val_a2[scr_out], ymin, ymax, 240, 0);
tft.drawLine(x1, y1, x2, y2, GREEN);
x1 = x2;
y1 = y2;
x2 = x2 + (tft.width()/k);
/*
Serial.print(scr_out);//
Serial.print(" , ");//
Serial.print(val_a2[scr_out]);//
Serial.println("");//
*/
scr_out++;
}
// Данный триггер сбросится только после заполнения буфера новыми данными в прерывании current_meter
trig = true;
}
CurA0calcMid = sqrt((sq(CurA0calcMax)+sq(CurA0calcMin))/2);
/*
Измеряем максимальный и минимальный пики синусоиды. Затем находим их среднеквадратичное значение.
пик = sqrt( ( (пик мин)^2 + (пик макс)^2 )/2 ) [маш.ед.]
Далее это значение (в машинных единицах - 0-1023) переводим в напряжение:
напряж. = (пик / 1023)*5 [Вольт]
Чувствительность ACS712-20 равна 100 милиВольт/Ампер = 0,1В/А (см. даташит на ACS), отсюда:
ток ампл. = напряж. / Чувствит. = напряж / 0,1 = напряж * 10 [Ампер]
Ток средний - это ток ампл., поделенный на корень из 2:
ток средний = ток ампл. / sqrt(2) = ток ампл. * 0,707 [Ампер]
Итого:
Ток = 0,707*ток ампл. = 0,707 * напряж / чувствит. = 0,707 * напряж. * 10 = 7,07 * напряж. =
= 7,07 * пик * 5 / 1023 = 35,35 * пик / 1023
*/
A0_current = 35.35 * CurA0calcMid / 1023.0;
//=================== Фильтр сглаживающий: ================
// передвигаем данные в массиве:
v = numReadings;
while (v > 0) {
readings[v]=readings[v-1];
v--;
}
readings[0] = A0_current;
// Serial.print("A0_current = "); Serial.print(A0_current); Serial.print(" ; ");
c = 0;
total = 0;
while (c < numReadings) {
total += readings[c];
// Serial.print(readings[c]); Serial.print(" ; ");
// Serial.print(total); Serial.println("");
c++;
}
// calculate the average:
average = total / numReadings;
// ======================================================
// Выводим на экран значение тока:
tft.setCursor(60, 4);
tft.setTextColor(WHITE); tft.setTextSize(1);
tft.print("Iact= "); tft.print(A0_current,2); tft.print(" A");
// Среднее значение тока (после фильтра)
tft.setCursor(180, 4);
tft.print("Iaver= "); tft.print(average,2); tft.print(" A");
// Serial.print("Free memory size: "); // печать количества свободной оперативной памяти
// Serial.println(memoryFree()); // печать количества свободной оперативной памяти
}
//********************обработчики прерываний*******************************
void current_meter() //прерывания таймера
{
PintTic++; //счетчик периодов
Uopornoe = analogRead(A15);
CurA0 = analogRead(ACS712)-(Uopornoe/2);
CurA0max = max(CurA0,CurA0max);
CurA0min = min(CurA0,CurA0min);
val_a[PintTic] = CurA0;
// val_Uo[PintTic] = Uopornoe;
// nb[PintTic] = PintTic;
// val_t[PintTic] = micros();
if(PintTic==k)
{
if (trig == true) {
z = 0;
while (z <= k) { val_a2[z] = val_a[z]; z++; }
// ymax = CurA0max; ymin = CurA0min; // Сохраняем макс. и мин. значения в массиве
}
trig = false;
PintTic=0; //обнуляем счетчик
CurA0calcMax=CurA0max;
CurA0calcMin=CurA0min;
CurA0max=0;
CurA0min=0;
}
}
//*************************************************************************
void Grid()
{
tft.fillScreen(BLACK);
// tft.drawLine(x1, y1, x2, y2, color);
// Ноль координат - в верхнем левом углу экрана!!! Вынос мозга...
tft.drawLine(0, 0, 0, 240, BLUE); // Ось ординат
// 120*75%=90.
tft.drawLine(0, (120-(90*(1024/(ymax-ymin)))), 319, (120-(90*(1024/(ymax-ymin)))), DARKGREEN); // 75%
// 120*50%=60.
tft.drawLine(0, (120-(60*(1024/(ymax-ymin)))), 319, (120-(60*(1024/(ymax-ymin)))), DARKGREEN); // 50%
// 120*25%=30.
tft.drawLine(0, (120-(30*(1024/(ymax-ymin)))), 319, (120-(30*(1024/(ymax-ymin)))), DARKGREEN); // 25%
// В пикселях по оси Y: 240/2=120 пикселей - это середина экрана.
tft.drawLine(0,120,319,120, BLUE); // Ноль
// 120 пикселей - это 100% сигнала. 120*25%=30.
tft.drawLine(0, (120+(30*(1024/(ymax-ymin)))), 319, (120+(30*(1024/(ymax-ymin)))), DARKGREEN); // -25%
// 120 пикселей - это 100% сигнала. 120*50%=60.
tft.drawLine(0, (120+(60*(1024/(ymax-ymin)))), 319, (120+(60*(1024/(ymax-ymin)))), DARKGREEN); // -50%
// 120 пикселей - это 100% сигнала. 120*75%=90.
tft.drawLine(0, (120+(90*(1024/(ymax-ymin)))), 319, (120+(90*(1024/(ymax-ymin)))), DARKGREEN); // -75%
}
// Переменные, создаваемые процессом сборки,
// когда компилируется скетч
// extern int __bss_end;
// extern void *__brkval;
/*
// Функция, возвращающая количество свободного ОЗУ (RAM)
int memoryFree()
{
int freeValue;
if((int)__brkval == 0)
freeValue = ((int)&freeValue) - ((int)&__bss_end);
else
freeValue = ((int)&freeValue) - ((int)__brkval);
return freeValue;
}
*/
Так?Kopyloff писал(а):Задача минимум на данный момент - собрать статистику энергопотребления в доме
Примерно так, только у меня будет 13 групп электроприемников (читай - 13 автоматов после счетчика)UAVpilot писал(а):Так?
Код: Выделить всё
init 12.646A26000000 /usr/local/lib/oweventd/bathfan init
init 26.0A3026000000 /usr/local/lib/oweventd/bathfan init
event ow 26.0A3026000000/VAD * /usr/local/lib/oweventd/bathfan check
init 12.8C4229000000 /usr/local/lib/oweventd/doormonitor init
init 12.90D21C000000 /usr/local/lib/oweventd/doormonitor init
event ow uncached/12.8C4229000000/latch.A 1 /usr/local/lib/oweventd/doormonitor start