modman писал(а):anton-anton писал(а): После этого собрал на ардуине нано небольшую схему с датчиком огня и датчиком задымления, до кучи навесил датчик температуры, теперь при с работке любого из датчиков, отключается (через реле) полностью питание принтера и включается зуммер, если кому интересно могу скинуть код прошивки, тут все просто).
А можно поподробнее о дополнительной независимой плате защиты? Схемку, ну и код =)
код простенький (в процессе отладки сейчас, отсутствует отключение питания из-за вероятности ложного срабатывания)
отличное решение реализовано в прошивке, где отклонение от заданной температуры более чем на 4 градуса отключает принтер
//https://www.electronicsblog.net/
//Arduino LCD horizontal progress bar using custom characters
//объявляем переменные с номерами пинов
#include <LiquidCrystal.h>
#include <LCDBitmap.h>
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
LCDBitmap bitmap(&lcd, 12, 0); // Assign the LCD bitmap to "&lcd" set in the previous line and set display location to (12,0)
unsigned long currentMillis; // Timer variable
const int sample = 1500; // Sets how long to run each sample
const int sensorPin0= 0;//датчик огонь
const int sensorPin1= 1; //датчик освещенност
const int sensorPin2= 2; //датчик дым
const int sensorPin3= 3; //датчик температура
const int sensorPin4= 4; //датчика Нет!
int smoke_level0;
int smoke_level1;
int smoke_level2;
int smoke_level3;
int smoke_level4;
int smoke_level5;
#include <LiquidCrystal.h>
#define lenght 8.0
double percent0=100.0;
double percent1=100.0;
double percent2=100.0;
double percent3=100.0;
double percent4=100.0;
unsigned char b;
unsigned char q;
unsigned char n;
unsigned char w;
unsigned int peace;
int r1 = 7;
int g1 = 6;
int r2 = 13;
int g2 = 8;
// custom charaters
byte p1[8] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10};
byte p2[8] = { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18};
byte p3[8] = { 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C};
byte p4[8] = { 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E};
byte p5[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F};
void setup() {
lcd.begin(16,2); // Initialize the LCD
bitmap.begin(); // Initalize the LCD bitmap
bitmap.home(); // Move cursor the home position (0,0)
lcd.print("Start");
randomSeed(analogRead(A0));
Serial.begin(115200);
pinMode(r1, OUTPUT);
pinMode(g1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(r1, HIGH); //включаем зеленый
digitalWrite(r2, HIGH); //включаем красный
// lcd.setCursor(0, 0);
// lcd.print("Start"); // выводим на дисплей традиционную фразу
// delay(300);
// bitmap.pixel
lcd.setCursor(0, 1);
lcd.print("<System>");
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(50);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(50);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(100);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
analogWrite(9, 1);
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
analogWrite(9, 0); // 0 - выключаем пьезо
currentMillis = millis();
while(millis()-currentMillis<sample) {
for (byte d=0; d<8; d++) {
bitmap.pixel(random(0, BITMAP_W), random(0, BITMAP_H), random(0, 2), NO_UPDATE); // Add one random pixel but don't update bitmap display
}
bitmap.update(); // 8 pixels positioned, now update bitmap display
}
lcd.clear();
lcd.createChar(0, p1);
lcd.createChar(1, p2);
lcd.createChar(2, p3);
lcd.createChar(3, p4);
lcd.createChar(4, p5);
}
void loop()
{
//lcd.setCursor(0, 0);
//fier
unsigned int value0= analogRead(0);
percent0 =100-value0/1020.0*100.0;
// lcd.print("");
// lcd.print(percent3);
// lcd.print(" ");
// lcd.setCursor(0,1);
//double o=lenght/100*percent0;
// drawing black rectangles on LCD
lcd.setCursor(0, 0);
//ADC conversion
unsigned int value1 = analogRead(1);
percent2 = value1/1000.0*100.0;
//lcd.print("L=");
// lcd.print(percent2);
// lcd.print(" ");
// lcd.setCursor(0,0);
// double s=lenght/100*percent1;
// drawing black rectangles on LCD
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("g= % t= %");
lcd.setCursor(0,1);
lcd.print(" ");
delay(0);
lcd.setCursor(9, 0);
//ADC conversion
unsigned int value3 = analogRead(3);
percent3 = value3/500.0*100.0;
lcd.print("t=");
lcd.print(percent3);
lcd.setCursor(15, 0);
lcd.print("%");
lcd.setCursor(8,1);
double s=lenght/100*percent3;
// drawing black rectangles on LCD
lcd.setCursor(0, 0);
//ADC conversion
unsigned int value2 = analogRead(2);
percent2 = value2/800.0*100.0;
lcd.print("g=");
lcd.print(percent2);
lcd.setCursor(6, 0);
lcd.print("% ");
lcd.setCursor(0,1);
double a=lenght/100*percent2;
// drawing black rectangles on LCD
// 1 запись
if (a>=1) {
for (int i=1;i<a;i++) {
lcd.write(4);
b=i;
}
a=a-b;
}
peace=a*5;
// drawing charater's colums
switch (peace) {
case 0:
break;
case 1:
lcd.print((char)0);
break;
case 2:
lcd.write(1);
break;
case 3:
lcd.write(2);
break;
case 4:
lcd.write(3);
break;
}
//clearing line
for (int i =0;i<(lenght-b);i++) {
lcd.print(" ");
}
;
// 2Я запись
if (s>=1) {
for (int j=1;j<s;j++) {
lcd.write(4);
n=j;
}
s=s-n;
}
peace=s*5;
// drawing charater's colums
switch (peace) {
case 0:
break;
case 1:
lcd.print((char)0);
break;
case 2:
lcd.write(1);
break;
case 3:
lcd.write(2);
break;
case 4:
lcd.write(3);
break;
}
//clearing line
for (int j =0;j<(lenght-n);j++) {
lcd.print(" ");
}
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
smoke_level0= analogRead(sensorPin0); // считать уровень
Serial.println(smoke_level0);
if(smoke_level0>1009){ // проверить допустимый ли уровень
digitalWrite(g1, HIGH);
} else{ digitalWrite(g1, LOW), digitalWrite(r1, HIGH),
lcd.setCursor(0, 0),lcd.print("! Warnin FIRE ! ");
lcd.setCursor(0, 1),lcd.print("level="), lcd.print(percent0),lcd.print(" % "),beep(200),delay(100),
analogWrite(9, 233), delay(50), analogWrite(9, 0); }
smoke_level1= analogRead(sensorPin1); // считать уровень
Serial.println(smoke_level1);
if(smoke_level1 < 800){ // проверить допустимый ли уровень
digitalWrite(g2, HIGH);
} else{ digitalWrite(g2, LOW), digitalWrite(r2, HIGH),
lcd.setCursor(0, 0),lcd.print("! Warnin Light ! ");
lcd.setCursor(0, 1),lcd.print("level="), lcd.print(percent1),lcd.print(" % "),beep(200),delay(10),
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0); }
smoke_level2= analogRead(sensorPin2); // считать уровень
Serial.println(smoke_level2);
if(smoke_level2 < 200){ // проверить допустимый ли уровень дыма (газа)
digitalWrite(g1, HIGH);
} else{ digitalWrite(g2, LOW), digitalWrite(r2, HIGH),
lcd.setCursor(0, 0),lcd.print("! Warnin GAS ! ");
lcd.setCursor(0, 1),lcd.print("level="), lcd.print(percent2),lcd.print(" % "),beep(200),delay(10) ,
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0),
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0); }
smoke_level3= analogRead(sensorPin3); // считать уровень
Serial.println(smoke_level3);
if(smoke_level3 < 130){ // проверить допустимый ли уровень
digitalWrite(g2, HIGH) ;
} else{ digitalWrite(g2, LOW), digitalWrite(r2, HIGH),
lcd.setCursor(0, 0),lcd.print("! Warnin Temp ! ");
lcd.setCursor(0, 1),lcd.print("level="), lcd.print(percent3),lcd.print(" % "),beep(200),delay(10),
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0),
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0),
analogWrite(9, 233), delay(50), analogWrite(9, 0), delay(50), analogWrite(9, 233), delay(50), analogWrite(9, 0); }
//если показатель освещенности меньше 800, включаем светодиод
//else digitalWrite(r2, HIGH); //иначе выключаем
delay(750); //ждем 50 Мс
}
void beep(unsigned char delayms){
analogWrite(9, 225); // значение должно находится между 0 и 255
// поэкспериментируйте для получения хорошего тона
delay(1000); // пауза delayms мс
analogWrite(9, 0); // 0 - выключаем пьезо
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем зеленый
delay(50);
digitalWrite(r1, LOW); //выключаем красный
delay(50);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(50);
analogWrite(9, 125);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(50);
digitalWrite(r2, HIGH); //включаем зеленый
delay(50);
digitalWrite(r2, LOW); //выключаем красный
delay(100);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50);
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(g1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
digitalWrite(g2, HIGH); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, LOW); //выключаем красный
digitalWrite(r2, LOW); //включаем красный
digitalWrite(g1, LOW); //выключаем красный
digitalWrite(g2, LOW); //включаем красный
delay(50); //ждем 50 Мс
digitalWrite(r1, HIGH); //включаем красный
digitalWrite(r2, HIGH); //включаем красный
delay(100); // пауза delayms мс
analogWrite(9, 0);
}
схемы нет,но если потребуется могу сделать,
тут 4 светодиода, бипер, датчик огня, освещенности, дыма, термистор, lcd 16x2.
требуется доработка т.к. датчик дыма должен прогреться минимум минуты для стабильной работы.
(показания отображаются в процентах от показаний датчиков - дыма и температуры со шкалой, показания освещенности и огня - не оттображаются - по ним идет сработка и отображение на дисплее причины (то есть датчика, который сработал)).