Форум » » Придумаем протокол? » Ответить

Придумаем протокол?

p.vladi: Короче решил я побольше использовать AVR микропроцессоры в народе известные из за Arduino. Плюсов для нашей индустрии море, и реле, и IO, и чего ты хочешь - от DMX до температурных сенсоров по всему дому. Сегодня решил рассеять сенсоры по всему дому, ибо нужно только три проводка для цепочки, и стоят они не дорого. Вопрос собственно такой, подключу я их к микропроцессору, а микропроцессор через RS232 к DIN-AP2. так как прошивку для микропроцессора буду писать я, протокол общения будет с нуля. вот и хочу понять, как сформировать signed analog ? выдачу температуры сделаю сразу в Crestron x10 (36.6° = 366) а вот как передать -5°? Заранее спасибо!

Ответов - 7

Kaveckiy: А если немного не так делать? Умножать температуру на 10 и прибавлять 300. Тогда 36,6 = 366+300=666 а -5 = -50+300=250? Учитывая, что абсолютный 0 = -273 градуса по Цельсию то у нас будет все возможные "минуса". Или использовать сразу шкалу Кельвина где 0 = -273 по Цельсию.

marin_n: а если использовать дополнительный код?

Вячеслав: Так в каком виде температура в ардуино? Или оно там видно только через какой то интерпретатор?


vasya_pupkin: А собственно зачем изобретать велосипед? Подключи МК к ком порту и обменивайся командами. На страничку назад откатись, http://nubiax6.ru/index.php/features/dimmer-temp-arduino Или вот тебе код для МЕГИ 16 реле и даласские датчики температуры по паразитному питанию: #include <OneWire.h> #include <DallasTemperature.h> #include <FlexiTimer2.h> #define ONE_WIRE_BUS 6 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int r1=8; int r2=9; int r3=10; int r4=11; int r5=12; int r6=7; int r7=22; int r8=23; int r9=24; int r10=25; int r11=26; int r12=27; int r13=28; int r14=29; int r15=30; int r16=31; char command_in[10]; char data_in[100]; void setup() { Serial.begin(9600); pinMode(r1, OUTPUT); pinMode(r2, OUTPUT); pinMode(r3, OUTPUT); pinMode(r4, OUTPUT); pinMode(r5, OUTPUT); pinMode(r6, OUTPUT); pinMode(r7, OUTPUT); pinMode(r8, OUTPUT); pinMode(r9, OUTPUT); pinMode(r10, OUTPUT); pinMode(r11, OUTPUT); pinMode(r12, OUTPUT); pinMode(r13, OUTPUT); pinMode(r14, OUTPUT); pinMode(r15, OUTPUT); pinMode(r16, OUTPUT); digitalWrite(r1, HIGH); digitalWrite(r2, HIGH); digitalWrite(r3, HIGH); digitalWrite(r4, HIGH); digitalWrite(r5, HIGH); digitalWrite(r6, HIGH); digitalWrite(r7, HIGH); digitalWrite(r8, HIGH); digitalWrite(r9, HIGH); digitalWrite(r10, HIGH); digitalWrite(r11, HIGH); digitalWrite(r12, HIGH); digitalWrite(r13, HIGH); digitalWrite(r14, HIGH); digitalWrite(r15, HIGH); digitalWrite(r16, HIGH); FlexiTimer2::set(10000, readDataFromTempSensor); FlexiTimer2::start(); } void readDataFromTempSensor() { sensors.begin(); delay(10); sensors.requestTemperatures(); Serial.print(""); delay(10); Serial.println(sensors.getTempCByIndex(0)); Serial.print(""); Serial.println(sensors.getTempCByIndex(1));} void loop() { int i=0; char buffer[100]; if(Serial.available()){ delay(100); while( Serial.available() && i< 99) { buffer[i++] = Serial.read(); } buffer[i++]='\0'; } if(i>0){ sscanf(buffer, "%s%s%d",&command_in, &data_in); } if ((String)command_in == "r1_on"){digitalWrite(r1, LOW);} if ((String)command_in == "r2_on"){digitalWrite(r2, LOW);} if ((String)command_in == "r3_on"){digitalWrite(r3, LOW);} if ((String)command_in == "r4_on"){digitalWrite(r4, LOW);} if ((String)command_in == "r5_on"){digitalWrite(r5, LOW);} if ((String)command_in == "r6_on"){digitalWrite(r6, LOW);} if ((String)command_in == "r7_on"){digitalWrite(r7, LOW);} if ((String)command_in == "r8_on"){digitalWrite(r8, LOW);} if ((String)command_in == "r9_on"){digitalWrite(r9, LOW);} if ((String)command_in == "r10_on"){digitalWrite(r10, LOW);} if ((String)command_in == "r11_on"){digitalWrite(r11, LOW);} if ((String)command_in == "r12_on"){digitalWrite(r12, LOW);} if ((String)command_in == "r13_on"){digitalWrite(r13, LOW);} if ((String)command_in == "r14_on"){digitalWrite(r14, LOW);} if ((String)command_in == "r15_on"){digitalWrite(r15, LOW);} if ((String)command_in == "r16_on"){digitalWrite(r16, LOW);} if ((String)command_in == "r1_off"){digitalWrite(r1, HIGH);} if ((String)command_in == "r2_off"){digitalWrite(r2, HIGH);} if ((String)command_in == "r3_off"){digitalWrite(r3, HIGH);} if ((String)command_in == "r4_off"){digitalWrite(r4, HIGH);} if ((String)command_in == "r5_off"){digitalWrite(r5, HIGH);} if ((String)command_in == "r6_off"){digitalWrite(r6, HIGH);} if ((String)command_in == "r7_off"){digitalWrite(r7, HIGH);} if ((String)command_in == "r8_off"){digitalWrite(r8, HIGH);} if ((String)command_in == "r9_off"){digitalWrite(r9, HIGH);} if ((String)command_in == "r10_off"){digitalWrite(r10, HIGH);} if ((String)command_in == "r11_off"){digitalWrite(r11, HIGH);} if ((String)command_in == "r12_off"){digitalWrite(r12, HIGH);} if ((String)command_in == "r13_off"){digitalWrite(r13, HIGH);} if ((String)command_in == "r14_off"){digitalWrite(r14, HIGH);} if ((String)command_in == "r15_off"){digitalWrite(r15, HIGH);} if ((String)command_in == "r16_off"){digitalWrite(r16, HIGH);} }

Вячеслав: Бесовщина ) Ничего не понять. С упоминанием DIN-8SW8 смахивает на кашу из топора ). Хотя мне судить сложно.

p.vladi: vasya_pupkin Интересная ссылка, я делал RS232 димеры на AVR - правда для мощных светодиодов. Принцип тоже, только полевой транзистор а не триак. Я думал делать димер на переменный ток, но, разобрав димеры от Crestron, Lutron, KNX и посмотрев сколько там всеразличных катушек и море компонентов, решил что наверное они не дураки, и была причина делать все сложно. Вот например, ток переменный, 50 Герц, если ШИМ попадает как раз на те моменты, когда нет тока? P.S. Но кстати разобрав популярный димер http://www.megamanuk.com/lightwaverf/products/dimmers/jsjslw420wh/ там как раз простейшея схема, триак, без катушек и прочего

vasya_pupkin: Вячеслав пишет: Бесовщина ) Ничего не понять. С упоминанием DIN-8SW8 смахивает на кашу из топора ). Хотя мне судить сложно. да это я для себя сделал :) И схема взята стандартная(от ардуино проектов), не я её придумал, просто 3 диммера объёдинил в одну схему. И код практически не я написал( оригинал, просто чуток допилил. Вот тебе код без 8sw8( у меня просто пара выходов 8sw8 было свободно): #include <CyberLib.h> #include <OneWire.h> #include <DallasTemperature.h> #include <MsTimer2.h> #define ONE_WIRE_BUS 10 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // ардуино 3 диммера, 2 энкодера, 2 ds18b20+ volatile uint8_t tic, Dimmer1, Dimmer2, Dimmer3; char unitID_in[10]; char command_in[10]; char data_in[255]; void setup() { Serial.begin(9600); D4_Out; D5_Out; D6_Out; D4_Low; D5_Low; D6_Low; D2_In; attachInterrupt(0, detect_up, LOW); StartTimer1(halfcycle, 40); StopTimer1(); MsTimer2::set(10000, readDataFromTempSensor); MsTimer2::start(); } void halfcycle() { tic++; if(Dimmer1 < tic ) D4_High; if(Dimmer2 < tic ) D5_High; if(Dimmer3 < tic ) D6_High; } void detect_up() { tic=0; ResumeTimer1(); attachInterrupt(0, detect_down, HIGH); } void detect_down() { StopTimer1(); D4_Low; D5_Low; D6_Low; tic=0; attachInterrupt(0, detect_up, LOW); } void readDataFromTempSensor() { sensors.begin(); delay(2); sensors.requestTemperatures(); Serial.print(""); delay(2); Serial.println(sensors.getTempCByIndex(0)); Serial.print(""); Serial.println(sensors.getTempCByIndex(1));} void loop() { int i=0; char buffer[100]; if(Serial.available()){ delay(100); while( Serial.available() && i< 99) { buffer[i++] = Serial.read(); } buffer[i++]='\0'; } if(i>0){ sscanf(buffer, "%s%s%d",&unitID_in,&command_in, &data_in); } if ((String)unitID_in == "1"){ if ((String)command_in == "0"){Dimmer1=0;} if ((String)command_in == "5"){Dimmer1=5;} if ((String)command_in == "10"){Dimmer1=10;} if ((String)command_in == "15"){Dimmer1=15;} if ((String)command_in == "20"){Dimmer1=20;} if ((String)command_in == "25"){Dimmer1=25;} if ((String)command_in == "30"){Dimmer1=30;} if ((String)command_in == "35"){Dimmer1=35;} if ((String)command_in == "40"){Dimmer1=40;} if ((String)command_in == "45"){Dimmer1=45;} if ((String)command_in == "50"){Dimmer1=50;} if ((String)command_in == "55"){Dimmer1=55;} if ((String)command_in == "60"){Dimmer1=60;} if ((String)command_in == "65"){Dimmer1=65;} if ((String)command_in == "70"){Dimmer1=70;} if ((String)command_in == "75"){Dimmer1=75;} if ((String)command_in == "80"){Dimmer1=80;} if ((String)command_in == "85"){Dimmer1=85;} if ((String)command_in == "90"){Dimmer1=90;} if ((String)command_in == "95"){Dimmer1=95;} if ((String)command_in == "100"){Dimmer1=100;} if ((String)command_in == "105"){Dimmer1=105;} if ((String)command_in == "110"){Dimmer1=110;} if ((String)command_in == "115"){Dimmer1=115;} if ((String)command_in == "120"){Dimmer1=120;} if ((String)command_in == "125"){Dimmer1=125;} if ((String)command_in == "130"){Dimmer1=130;} if ((String)command_in == "135"){Dimmer1=135;} if ((String)command_in == "140"){Dimmer1=140;} if ((String)command_in == "145"){Dimmer1=145;} if ((String)command_in == "150"){Dimmer1=150;} if ((String)command_in == "155"){Dimmer1=155;} if ((String)command_in == "160"){Dimmer1=160;} if ((String)command_in == "165"){Dimmer1=165;} if ((String)command_in == "170"){Dimmer1=170;} if ((String)command_in == "175"){Dimmer1=175;} if ((String)command_in == "180"){Dimmer1=180;} if ((String)command_in == "185"){Dimmer1=185;} if ((String)command_in == "190"){Dimmer1=190;} if ((String)command_in == "195"){Dimmer1=195;} if ((String)command_in == "200"){Dimmer1=200;} if ((String)command_in == "255"){Dimmer1=255;} } if ((String)unitID_in == "2"){ if ((String)command_in == "0"){Dimmer2=0;} if ((String)command_in == "5"){Dimmer2=5;} if ((String)command_in == "10"){Dimmer2=10;} if ((String)command_in == "15"){Dimmer2=15;} if ((String)command_in == "20"){Dimmer2=20;} if ((String)command_in == "25"){Dimmer2=25;} if ((String)command_in == "30"){Dimmer2=30;} if ((String)command_in == "35"){Dimmer2=35;} if ((String)command_in == "40"){Dimmer2=40;} if ((String)command_in == "45"){Dimmer2=45;} if ((String)command_in == "50"){Dimmer2=50;} if ((String)command_in == "55"){Dimmer2=55;} if ((String)command_in == "60"){Dimmer2=60;} if ((String)command_in == "65"){Dimmer2=65;} if ((String)command_in == "70"){Dimmer2=70;} if ((String)command_in == "75"){Dimmer2=75;} if ((String)command_in == "80"){Dimmer2=80;} if ((String)command_in == "85"){Dimmer2=85;} if ((String)command_in == "90"){Dimmer2=90;} if ((String)command_in == "95"){Dimmer2=95;} if ((String)command_in == "100"){Dimmer2=100;} if ((String)command_in == "105"){Dimmer2=105;} if ((String)command_in == "110"){Dimmer2=110;} if ((String)command_in == "115"){Dimmer2=115;} if ((String)command_in == "120"){Dimmer2=120;} if ((String)command_in == "125"){Dimmer2=125;} if ((String)command_in == "130"){Dimmer2=130;} if ((String)command_in == "135"){Dimmer2=135;} if ((String)command_in == "140"){Dimmer2=140;} if ((String)command_in == "145"){Dimmer2=145;} if ((String)command_in == "150"){Dimmer2=150;} if ((String)command_in == "155"){Dimmer2=155;} if ((String)command_in == "160"){Dimmer2=160;} if ((String)command_in == "165"){Dimmer2=165;} if ((String)command_in == "170"){Dimmer2=170;} if ((String)command_in == "175"){Dimmer2=175;} if ((String)command_in == "180"){Dimmer2=180;} if ((String)command_in == "185"){Dimmer2=185;} if ((String)command_in == "190"){Dimmer2=190;} if ((String)command_in == "195"){Dimmer2=195;} if ((String)command_in == "200"){Dimmer2=200;} if ((String)command_in == "255"){Dimmer2=255;} } if ((String)unitID_in == "3"){ if ((String)command_in == "0"){Dimmer3=0;} if ((String)command_in == "5"){Dimmer3=5;} if ((String)command_in == "10"){Dimmer3=10;} if ((String)command_in == "15"){Dimmer3=15;} if ((String)command_in == "20"){Dimmer3=20;} if ((String)command_in == "25"){Dimmer3=25;} if ((String)command_in == "30"){Dimmer3=30;} if ((String)command_in == "35"){Dimmer3=35;} if ((String)command_in == "40"){Dimmer3=40;} if ((String)command_in == "45"){Dimmer3=45;} if ((String)command_in == "50"){Dimmer3=50;} if ((String)command_in == "55"){Dimmer3=55;} if ((String)command_in == "60"){Dimmer3=60;} if ((String)command_in == "65"){Dimmer3=65;} if ((String)command_in == "70"){Dimmer3=70;} if ((String)command_in == "75"){Dimmer3=75;} if ((String)command_in == "80"){Dimmer3=80;} if ((String)command_in == "85"){Dimmer3=85;} if ((String)command_in == "90"){Dimmer3=90;} if ((String)command_in == "95"){Dimmer3=95;} if ((String)command_in == "100"){Dimmer3=100;} if ((String)command_in == "105"){Dimmer3=105;} if ((String)command_in == "110"){Dimmer3=110;} if ((String)command_in == "115"){Dimmer3=115;} if ((String)command_in == "120"){Dimmer3=120;} if ((String)command_in == "125"){Dimmer3=125;} if ((String)command_in == "130"){Dimmer3=130;} if ((String)command_in == "135"){Dimmer3=135;} if ((String)command_in == "140"){Dimmer3=140;} if ((String)command_in == "145"){Dimmer3=145;} if ((String)command_in == "150"){Dimmer3=150;} if ((String)command_in == "155"){Dimmer3=155;} if ((String)command_in == "160"){Dimmer3=160;} if ((String)command_in == "165"){Dimmer3=165;} if ((String)command_in == "170"){Dimmer3=170;} if ((String)command_in == "175"){Dimmer3=175;} if ((String)command_in == "180"){Dimmer3=180;} if ((String)command_in == "185"){Dimmer3=185;} if ((String)command_in == "190"){Dimmer3=190;} if ((String)command_in == "195"){Dimmer3=195;} if ((String)command_in == "200"){Dimmer3=200;} if ((String)command_in == "255"){Dimmer3=255;} } }При посылке по ком-порту от процессора "1 255", "2 255", "3 255" напряжение на выходе симистора падает до 14В, т.е. можно фазу подавать не от крестроновского реле, а паралелить фазу от входа оптопары. У крестрона вообще из полезных железяк только процессоры(из-за их интуитивно понятного симпла и vt pro) - подключаем к ком-портам 3 ардуино мега и можно творить чудеса. А если мк посложнее типа Beaglebone Black можно сделать большущий проект . А если учитывать что б/у crestron cp2e стоит 6 тыщ рублей(я на ебее за столько взял), а ардуино мега 420 рублей на алиэкспрессе, плата 8 реле - 400 рубл., контакторы в интернет-магазинах в Москве по 600 рубл. Legrand БШ 25А 2но, то за 200 тыс. рублей можно автоматизировать 3-ёх этажных оффис, с учётом того, что большая часть денег уйдёт на атоматы, щиты, контакторы, клемники, кнопки. А в качсестве планшетов использовать дешёвые китайские 7 -мидюйвомые планшеты.



полная версия страницы