ATtiny13 Передатчик 433МГц

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Пытаюсь использовать ATtiny13 как пульт, код вроде оптимизировал но все равно  2 082 байт.
что еще можно изменить?

 

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>

RCSwitch mySwitch = RCSwitch();
int main( void ) {
mySwitch.enableTransmit(3);
while(1) {
mySwitch.send(11235377, 24);
_delay_ms(500);
}
return 0;
}

Хотел по кнопке отправлять сигнал 
 

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
const int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {
mySwitch.enableTransmit(0);
pinMode(button, INPUT);
}
void loop() {
if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);}
_delay_ms(500);
}

Код уже весит 640 байт а функционал не пашет(( Где оступился?

Jatixo
Offline
Зарегистрирован: 13.01.2016

Попробуйте _delay_ms(500); в фигурные скобки перенести, а не после них. А то получается Вам нужно держать кнопку, чтобы сработало наверняка. А если перенести, то будет в любое время от короткого нажатия.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Попробуйте _delay_ms(500); в фигурные скобки перенести, а не после них. А то получается Вам нужно держать кнопку, чтобы сработало наверняка. А если перенести, то будет в любое время от короткого нажатия.

 

if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);
_delay_ms(500);}

 

?

Jatixo
Offline
Зарегистрирован: 13.01.2016

Да

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Да

я просто не понимаю почему кнопка не срабатывает, цепляю через резюк на 10к к земле дальше на пин что в коде и тишина

Jatixo
Offline
Зарегистрирован: 13.01.2016

А сразу не заметил, а зачем Вы используете loop, без setup (как в ардуино), если уж оттуда пример, то надо main убирать, или в main так и делать, как там:

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
const int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {
mySwitch.enableTransmit(0);
pinMode(button, INPUT);
while(1) {
  if(digitalRead(button) == LOW){
    mySwitch.send(11235377, 24);
    _delay_ms(500);
  }
}
return 0;
}

Хотя может это не главное, и в ардуино ide это предусмотрели, а почему у Вас enableTransmit, то 0, то 3, нужно определиться, как именно у Вас работает.

А кнопку можно подключить так: pinMode(button, INPUT); заменить на pinMode(button, INPUT_PULLUP);, а пин 3 на кнопку, а от кнопки к земле без резистора, только не перепутайте ничего. Потом надо не забывать, что если вдруг сделаете этот пин на выход, то уже на землю или питание замыкать нельзя, а то сгорит.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Да

 

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
const int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {

mySwitch.enableTransmit(0);
pinMode(button, INPUT);
}
void loop() {
if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);
_delay_ms(500);}

}

тишина((( может что то не так? 

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

7am пишет:

тишина((( может что то не так? 

Причин очень много, у Вас без кнопки то точно все работает? С mySwitch.enableTransmit 0 или 3? Может кнопка не на 3 пине, и так как Вы подключили будет отправлять сигнал даже без нажатия кнопки, так как когда кнопка не нажата, то пин висит в воздухе и принимает наводки, а там то Low, то High будет, то есть он просто сам будет отправлять, поэтому надо подтягивающий резистор внешний или внутренний, как выше написал.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

А сразу не заметил, а зачем Вы используете loop, без setup (как в ардуино), если уж оттуда пример, то надо main убирать, или в main так и делать, как там:


 

код больше становиться весом потому что

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

7am пишет:

тишина((( может что то не так? 

Причин очень много, у Вас без кнопки то точно все работает? С mySwitch.enableTransmit 0 или 3? Может кнопка не на 3 пине, и так как Вы подключили будет отправлять сигнал даже без нажатия кнопки, так как когда кнопка не нажата, то пин висит в воздухе и принимает наводки, а там то Low, то High будет, то есть он просто сам будет отправлять, поэтому надо подтягивающий резистор внешний или внутренний, как выше написал.

резистор стоит, открыт последовательный порт и смотрю прием но что с кнопкой что просто отправка сигнала тишина, а код в дуинке пашет

Jatixo
Offline
Зарегистрирован: 13.01.2016

Если как я написал, и как Вы, разница в размере большая, значит точно, в Вашем случае, код loop просто удаляется компилятором, потому что не используется в main, он существует просто как внешняя функция, но так как не используется, удаляется, а поэтому и не выполняется, и не работает. Раз не помещается, значит Вам надо вручную делать отправку нужного пакета без библиотеки, это не очень сложно, зато занимать будет мало места. Можно просто менять состояния пина на передатчик low/high с delay, в цикле, главное разобраться с длительностями. Также попробуйте другие библиотеки, RemoteSwitch, и тому подобное, может что-нибудь влезет в attiny13

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Кнопка на 3 передатчик на 0

в этом случае код весит 640 байт
а если поставлю void setup  2 262 байт
 

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
const int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {

mySwitch.enableTransmit(0);
pinMode(button, INPUT);
}
void loop() {
if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);
_delay_ms(500);}

}

код работающий на ардуинке
 

#include <RCSwitch.h>
int button = 12;
RCSwitch mySwitch = RCSwitch();

void setup() {
Serial.begin(9600);
mySwitch.enableTransmit(10);
pinMode(button, INPUT);
}

void loop() {
 if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);}
delay(500);
}

 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Потом надо не забывать, что если вдруг сделаете этот пин на выход, то уже на землю или питание замыкать нельзя, а то сгорит.


а не могли бы пояснить

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Если как я написал, и как Вы, разница в размере большая, значит точно, в Вашем случае, код loop просто удаляется компилятором, потому что не используется в main, он существует просто как внешняя функция, но так как не используется, удаляется, а поэтому и не выполняется, и не работает. Раз не помещается, значит Вам надо вручную делать отправку нужного пакета без библиотеки, это не очень сложно, зато занимать будет мало места. Можно просто менять состояния пина на передатчик low/high с delay, в цикле, главное разобраться с длительностями. Также попробуйте другие библиотеки, RemoteSwitch, и тому подобное, может что-нибудь влезет в attiny13

 

RemoteSwitch пробовал, тишина. 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Ребят, перекопал инет, хоть кто нибудь собирал простой пульт с одной кнопкой на Attiny 13? библиотека 

RCSwitch. 

Отзовитесь пожалуйста(((

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Не знаю, что у Вас за _delay_ms, но если стандартный из атмеловской библиотеки, то он 500 не бывает. Максимально, что можно, это 262.14 ms / F_CPU_M, где F_CPU_M таковая частота в Мегагерцах.

Попробуйте исправить. Если Ваш код с main не заработает, опубликуйте свежую версию - посмотрим.

 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

ЕвгенийП пишет:

Не знаю, что у Вас за _delay_ms, но если стандартный из атмеловской библиотеки, то он 500 не бывает. Максимально, что можно, это 262.14 ms / F_CPU_M, где F_CPU_M таковая частота в Мегагерцах.

Попробуйте исправить. Если Ваш код с main не заработает, опубликуйте свежую версию - посмотрим.

 

 

Так или нужно прописывать пределитель?
 

#undef F_CPU
#define F_CPU 1200000L
#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {
mySwitch.enableTransmit(0);
pinMode(button, INPUT);
}
void loop() {
if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);}
_delay_ms(262);
}

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, я не знаю. Вот Вы написали во второй строке 1,2МГц, а реальная-то частота какая? Она должна совпадать. На какой частоте Ваша тинька работает?

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

ЕвгенийП пишет:

Ну, я не знаю. Вот Вы написали во второй строке 1,2МГц, а реальная-то частота какая? Она должна совпадать. На какой частоте Ваша тинька работает?

 

на 1.2 и работает

Jatixo
Offline
Зарегистрирован: 13.01.2016

7am пишет:

Jatixo пишет:

Потом надо не забывать, что если вдруг сделаете этот пин на выход, то уже на землю или питание замыкать нельзя, а то сгорит.


а не могли бы пояснить

Как я написал, пин у вас будет на вход, и когда нажимаете на кнопку, будет замыкаться на землю, всё как положено. Но если вдруг в будущем Вы измените код, и этот пин у вас будет на выход OUTPUT + digitalWrite(HIGH), и Вы забудете, что у вас на этом пине кнопка и нажмете ее, то произойдет короткое замыкание и сгорит или один пин, или микроконтроллер. Поэтому при тестировании разных скетчей, надо не забывать об этом.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Ув.ТС! Код ваш "не жужжит и в дырку не лезет" потому, что Вы подключаете очень толстую библиотеку.

Я никогда такой не пользовался, но пять мин потратил.

В программе своей вы используете ТОЛЬКО сенд кода.

если по шагам пройти все, что делает библиотека это превращает ваше числов 24 бита, дополнив старшими нулями, а потом посылает на передатчик.

"0"- 350 мкс HIGH потом 1050 мкс LOW

"1" - 1050 мкс HIGH потом 350 мкс LOW

и ВСЁ!!!! для этого не нужно подключать никакую библиотеку!

я с экрана напишу, без проверки, ошибки сами найдете,, если что: (всякие номера ваших пинов я не проверял)

#define txpin 3

void setup() {
 pinMode (txpin,OUTPUT);
 digitalWrite(txpin,LOW);

}

void loop() {
 
unsigned long code = 12345678; //ваш код
boolean button_is_pressed; //тут проверьте свою кнопку

if (button_is_pressed)
for (int i = 0; i < 24; i++)
  {
   if (code & 1)
     {
      digitalWrite(txpin,HIGH);
      delayMicroseconds(1050);
      digitalWrite(txpin,LOW);
      delayMicroseconds(350);
     }
   else
     {
      digitalWrite(txpin,HIGH);
      delayMicroseconds(350);
      digitalWrite(txpin,LOW);
      delayMicroseconds(1050);
     }
   code = code>>1;  
  }


}

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

7am пишет:

RemoteSwitch пробовал, тишина. 

А Вы как пробовали? Там надо с помощью тестового скетча через приемник получить код, который хотите отправлять, записать куда-нибудь и используя эти числа, другим скетчем отправлять. Собственно как Вы наверное и делали с RCSwitch, только чисел по-больше.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

и, конечно, библиотечные digilWrite() и подобное нужно наменить на прямое обращение.

Все есть в ветке про тиньку13, которая "прилеплена" вверху раздела.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

 

Спасибо что дали понять что библиотека может быть тяжелый для всего этого. Даже если код компилируется?
а кнопку нужно обьявлять ? boolean button_is_pressed; ?

#define BTN_PIN 0

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

Я же говорю, код компилируется, но loop выбрасывается из кода, чтобы это проверить, попробуйте переименовать loop в любой набор букв abcdefg, и скомпилировать, ничего не изменится в размере, потом скопируйте 10 раз этот loop и все назовите по-разному loop1, loop2, loop3 и размер останется точно таким же. Или вообще удалите loop из своего примера, размер останется такой же, что и с loop.

Кнопку объявлять необязательно, можно также в if писать сразу digitalRead

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

терпение есть истино христианская добродетель.

Я, конечно,  православный, но выкрест, если понимаете, о чем я.

Не чувствую в себе силы объяснять больше, чем может дать гугль, да благославит Б..г его, и апостолы его в Википедии.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЗЫ: Вы в самом деле не способны применить без сторонних советов то, что я написал?

.... сорри за невнятность.... алкоголизм == часть духовных скреп....

...но это ведь пи...дец!! как мне кажеться или кажеццо, х..й его знает про современную грамматику.

satelit 2
Offline
Зарегистрирован: 04.12.2016

у меня приемник с примерами не работает. передатчик работает-проверял. скиньте пожалуйста тест-передатчик шлет код-приемник принимает в  сериал порта

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Я же говорю, код компилируется, но loop выбрасывается из кода, чтобы это проверить, попробуйте переименовать loop в любой набор букв abcdefg, и скомпилировать, ничего не изменится в размере, потом скопируйте 10 раз этот loop и все назовите по-разному loop1, loop2, loop3 и размер останется точно таким же. Или вообще удалите loop из своего примера, размер останется такой же, что и с loop.

Кнопку объявлять необязательно, можно также в if писать сразу digitalRead

loop менял, компилируется но опять тишина...

#include <RCSwitch.h>
#include <avr/io.h>
#include <util/delay.h>
int button = 3;
RCSwitch mySwitch = RCSwitch();
int main( void ) {
mySwitch.enableTransmit(0);
pinMode(button, INPUT_PULLUP);
}
void abc() {
if(digitalRead(button) == LOW){mySwitch.send(11235377, 24);}
_delay_ms(262);
}

 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

ЗЫ: Вы в самом деле не способны применить без сторонних советов то, что я написал?

.... сорри за невнятность.... алкоголизм == часть духовных скреп....

...но это ведь пи...дец!! как мне кажеться или кажеццо, х..й его знает про современную грамматику.

я рад вашим бурным эмоциям но не работает, я просто не знаю куда копать, модуль работает, с питанием все норм, тинька шьется, вроде все норм

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

опишите свою цель просто русским языком, без терминов.

Обе стороны и передачу и прием. У меня, само-собой, дома есть все типы железок и модулей.

Я сделаю по-своему, у меня все равно творческий кризис и других дел нет, и расскажу как это нужно делать, ОК?

Объяснять ничего не буду, так как без мата - не получится. ;).

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

опишите свою цель просто русским языком, без терминов.

Обе стороны и передачу и прием. У меня, само-собой, дома есть все типы железок и модулей.

Я сделаю по-своему, у меня все равно творческий кризис и других дел нет, и расскажу как это нужно делать, ОК?

Объяснять ничего не буду, так как без мата - не получится. ;).

Просто есть Attiny 13, есть код считанный с ду пульта, нужно этот код отправлять через модуль 433Мгц если нажата кнопка.

По сути такой же ду с одной кнопкой на Attiny 13. и так и сяк уже, и Loop убирал и оптимизацию делал, и проверял ваш код только немного изменив с кнопкой и все равно никак, и просто пытался вещать код без кнопки.
на ардуинке приемник для проверки, и каждый раз когда Attiny 13 прошиваю, смотрю в монитор порта и тишина((

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

у меня все равно творческий кризис и других дел нет

и просто для размышления тогда, как бы дольше можно было использовать батарейку типа CR2032 посылая Attiny в сон, ну а при нажатие кнопки просыпалась бы и отправляла код ду пульта

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

сорри за май френч, но Вы можете написать то, что спрошено?

Кого е..бет происхождение кода?

Есть тинька13 - передатчик, должна что-то передать при неких условиях, есть некая ардуина - приемник, должна что-то принять и, поскольку я буду моделировать, то написать в порт или зажечь лампочку. ВСЕ МЛЯ!!!!!!

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

7am пишет:

wdrakula пишет:

у меня все равно творческий кризис и других дел нет

и просто для размышления тогда, как бы дольше можно было использовать батарейку типа CR2032 посылая Attiny в сон, ну а при нажатие кнопки просыпалась бы и отправляла код ду пульта

ВОт про такое - сколько угодно расскажу. только завтра, после пива, ОК?

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

сорри за май френч, но Вы можете написать то, что спрошено?

Кого е..бет происхождение кода?

Есть тинька13 - передатчик, должна что-то передать при неких условиях, есть некая ардуина - приемник, должна что-то принять и, поскольку я буду моделировать, то написать в порт или зажечь лампочку. ВСЕ МЛЯ!!!!!!

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


Да *ля, говорю есть Attiny 13, просто должна отправлять команду по нажатию кнопки 
Нет приемников, лампочек просто тупо отпралять 11235377, 24bit  по нажатию 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

7am пишет:

и просто для размышления тогда, как бы дольше можно было использовать батарейку типа CR2032 посылая Attiny в сон, ну а при нажатие кнопки просыпалась бы и отправляла код ду пульта

ВОт про такое - сколько угодно расскажу. только завтра, после пива, ОК?

ок))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

так, пока не уснул....

нет понятия отправить число.

FS1000 это просто генератор на 433 и что-то та МГц.

по линии "дата" он включаеццо и выключаеццо.

"Передача" числа, или кода, как Вам нравиться, состоит в манипуляции вкл и выкл.

Откройте же, к екарной матери, ТЕКСТ своей библиотеки!!!!

В ней есть ТРИ типовых способа кодирования нуля и единицы и возможность пользователю указать собственный.

----------------------

Так что НЕТ, мля, НЕТ НЕТ и НЕТ! способа "просто передать код".

Поэтому я и написал, что я напишу работающий передатчик и приемник, передатчик - на тиньке, приемник - на любой Ардуинке, и они достигнут огразма одновременно.

------

НО!!!!

Если Вам нужно, чтобы некое иное устройство, тоже поняло переданный код, то нужно иметь уровень знаний сильно выше Вашего.

Или, начиная с завтрашеного дня, я укажу путь, по которому можно достичь цели. Но без дискуссий и ссылок, что "мне тут на форуме сказали".

Я - пишу что и где сделать, Вы делаете. Полный нацизм! ;) ;) ;)

Мазл тов!

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

wdrakula пишет:

 

----------------------

Так что НЕТ, мля, НЕТ НЕТ и НЕТ! способа "просто передать код".

Поэтому я и написал, что я напишу работающий передатчик и приемник, передатчик - на тиньке, приемник - на любой Ардуинке, и они достигнут огразма одновременно.

------

думаю будет достаточно 

Jatixo
Offline
Зарегистрирован: 13.01.2016

7am пишет:

loop менял, компилируется но опять тишина...

Я это написал, не для того чтобы заливать в микроконтроллер, а для того, чтобы Вы поняли, что этот код не доходит до микроконтроллера, а выбрасывается как комментарий. Именно поэтому он мало занимает места, потому что loop выбрасывается, а main почти пустой остается. Вы же видите размер после компиляции без загрузки, поэтому я и написал, скопируйте loop 10 раз и размер останется тот же самый, что с loop, что без. Вам в чужой код осталось кнопку через if обернуть и setup прописать как и раньше, заработает если пакеты правильные. Правда еще лучше бы обернуть в for и раза 3 отправлять, а не один раз, хотя из-за того что кнопка какое-то время будет нажата, то он сам несколько раз отправится, только в конец надо задержку поставить, около 10 ms, а не 500 как раньше.

Jatixo
Offline
Зарегистрирован: 13.01.2016
#define txpin 0
byte button = 3;
unsigned long code = 11235377; //ваш код


int main( void ) {
  pinMode (txpin, OUTPUT);
  digitalWrite(txpin, LOW);
  pinMode(button, INPUT_PULLUP);

  
  while(1) {
    if (digitalRead(button) == LOW)
    {
      for (byte i = 0; i < 24; i++)
      {
        if (code & 1)
        {
          digitalWrite(txpin,HIGH);
          delayMicroseconds(1050);
          digitalWrite(txpin,LOW);
          delayMicroseconds(350);
        }
        else
        {
          digitalWrite(txpin,HIGH);
          delayMicroseconds(350);
          digitalWrite(txpin,LOW);
          delayMicroseconds(1050);
        }
       code = code>>1;  
      }
      delayMicroseconds(10000); // delay(10); не хватило памяти =)
    }
  }
  
  return 0;
}

 

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

7am пишет:

loop менял, компилируется но опять тишина...

Я это написал, не для того чтобы заливать в микроконтроллер, а для того, чтобы Вы поняли, что этот код не доходит до микроконтроллера, а выбрасывается как комментарий. Именно поэтому он мало занимает места, потому что loop выбрасывается, а main почти пустой остается. Вы же видите размер после компиляции без загрузки, поэтому я и написал, скопируйте loop 10 раз и размер останется тот же самый, что с loop, что без. Вам в чужой код осталось кнопку через if обернуть и setup прописать как и раньше, заработает если пакеты правильные. Правда еще лучше бы обернуть в for и раза 3 отправлять, а не один раз, хотя из-за того что кнопка какое-то время будет нажата, то он сам несколько раз отправится, только в конец надо задержку поставить, около 10 ms, а не 500 как раньше.

спасибо большое, я очень ценю то что вы расписываете, и глубже погружаюсь в это, буду расти. Спасибо что направляете, тюкаете. Сейчас посмотрю что тут

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

#define txpin 0
byte button = 3;
unsigned long code = 11235377; //ваш код


int main( void ) {
  pinMode (txpin, OUTPUT);
  digitalWrite(txpin, LOW);
  pinMode(button, INPUT_PULLUP);

  
  while(1) {
    if (digitalRead(button) == LOW)
    {
      for (byte i = 0; i < 24; i++)
      {
        if (code & 1)
        {
          digitalWrite(txpin,HIGH);
          delayMicroseconds(1050);
          digitalWrite(txpin,LOW);
          delayMicroseconds(350);
        }
        else
        {
          digitalWrite(txpin,HIGH);
          delayMicroseconds(350);
          digitalWrite(txpin,LOW);
          delayMicroseconds(1050);
        }
       code = code>>1;  
      }
      delayMicroseconds(10000); // delay(10); не хватило памяти =)
    }
  }
  
  return 0;
}

 

 

вот так же много пробовал но почему то все равно не транслирует(( не пойму в чем дело. модуль вроде пашет тинька тоже

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:


кнопка я так понимаю на землю?

Jatixo
Offline
Зарегистрирован: 13.01.2016

Да, может частота не та, можно проверить, подключить вместо передатчика светодиод через резистор, в скетче сделать blink 1 сек, и проверить точно ли 1 секунду горит, одну не горит, а если 0,5 сек или 2 сек и т.д., значит что-то не так.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Да, может частота не та, можно проверить, подключить вместо передатчика светодиод через резистор, в скетче сделать blink 1 сек, и проверить точно ли 1 секунду горит, одну не горит, а если 0,5 сек или 2 сек и т.д., значит что-то не так.

 

наконец то я получил данные))ураа! нооо
я получаю Received 8388607 / 23bit Protocol: 6

вместо Received 11235377 / 24bit Protocol: 1
куда копать?
nik182
Онлайн
Зарегистрирован: 04.05.2015

Я дико извиняюсь, но если вы используете свой main, то не происходит init и не инициализируются таймеры и не работают задержки. Используйте стандартные setup и loop. Без библиотеки и с ними места хватит. И работать будет с правильными таймингами.

7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Jatixo пишет:

Да, может частота не та, можно проверить, подключить вместо передатчика светодиод через резистор, в скетче сделать blink 1 сек, и проверить точно ли 1 секунду горит, одну не горит, а если 0,5 сек или 2 сек и т.д., значит что-то не так.

работала работала потом перестала посылать что то и теперь при залитии кода ошибка
avrdude: stk500_getsync(): not in sync: resp=0x15
спалил что ли, кнопка через резюк 10к стоит 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вот код, как и обещал.

Он проверенно работает на тиньке. Ядро для тиньки взято из ветки про нее. Там есть ссылка, я пользую то ядро, где нормально переключаются частоты.

Переданный код ловится на Леонардо, программой из примера библиотеки RCswitch. Библиотека была взята утром, с гитхаба, самая свежая.

пин передатчика - 3, кнопки - 0, светодиод мне нужен был для наглядности - на 4ом пине (нумерация PB0,1,2,3,4...)

Что еще? Антидребезг возможно неочевиден, он без миллис, просто на колисестве повторов. Осцилографом смотришь и определяешь к-во повторов на своей частоте.

----

Еще - это китайское говно (FS1000a) вымотало мне всю душу!!!! загоняешь в передатчик просто меандр 100+100 мкс, а приемник его нихрена не видит, пока не попляшешь с передатчиком вокруг - просто поворачивая его во все стороны.

Короче Вам понадобятся антенны - смотрите в поиске - там много вариантов есть.

Все, код - ниже, комменты - завтра, если что непонятно. Код, по нажатию кнопки (на землю) 10 раз передает число в эфир.

=======================

#define _NOP() asm volatile("nop")

#define _LED()      (DDRB  |= 0B00010000)  
#define _LED_ON()   (PORTB |= 0B00010000)
#define _LED_OFF()  (PORTB &= 0B11101111)
  
//#define F_CPU 4800000UL
#define LOOP_CYCLES 8
#define us(num) (1.33*num/(LOOP_CYCLES*(1/(F_CPU/1000000.0))))

inline __attribute__((gnu_inline)) void asm_delay(uint16_t delay){
  uint16_t u=us(delay);
do _NOP(); while(delay--);
}


#define wdelay_us(x)  asm_delay(us(x))
//#define wdelay_us(x)  delayMicroseconds(x)
#define wdelay(x) delay(x)
//========================================================

#define txpin 3
#define buttonpin 0
#define TX_HI()   (PORTB |= 0B00001000)
#define TX_LO()   (PORTB &= 0B11110111)
//#define TX_HI()   digitalWrite(txpin, HIGH)
//#define TX_LO()   digitalWrite(txpin, LOW)



void setup() {
_LED();
 pinMode (buttonpin, INPUT);
 digitalWrite(buttonpin,HIGH);
 pinMode (txpin,OUTPUT);
 digitalWrite(txpin,LOW);

}

void loop() {

unsigned long code = 123456; //ваш код
boolean button_is_pressed=false; //тут проверьте свою кнопку
static char ob = digitalRead(buttonpin);
char nb = digitalRead(buttonpin);
static uint16_t debnc = 0;
static char isfirst=false;

if (nb==ob && debnc < 2000) debnc++; 
if (nb!=ob) {ob=nb;debnc = 0;}
if (debnc == 1000 && nb == LOW)   {button_is_pressed=true;}

if (button_is_pressed){
button_is_pressed=false;
  
for (int ii=0;ii<10; ii++){ 
  _LED_ON();
  noInterrupts();
  for (int i = 23; i >=0; i--)
  {
   if (code & (1L<<i))
     {
      TX_HI();
      wdelay_us(1050);
      TX_LO();
      wdelay_us(350);
     }
   else
     {
      TX_HI();
      wdelay_us(350);
      TX_LO();
      wdelay_us(1050);
     }
  }

TX_HI();
wdelay_us(350);
TX_LO();
wdelay_us(350*31);
interrupts();
}
}
_LED_OFF();

}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Да, Вы вроде просили на 1200 КГц? я так собирал.

Три первых ифа, после объявления переменных - это и есть новый тип дебонсера. Я к такому проникся ;). если не понятно, как он работает - то спрашивайте - я завтра объясню.

---

Для отладки я использовал осцил и логанализатор. Без них я бы не понял причину. Только логанализатор дал понять, что библиотека хочет множественную передачу с повторами.

Короче коллеги! Не жалейте 1000р на DSO138 и 300р на SaleaeLogic! После паяльной станции - самая нужная мелочевка!

Jatixo
Offline
Зарегистрирован: 13.01.2016

7am, ВНИМАНИЕ!!! хочу предостеречь от порчи микросхемы, в коде wdrakula если Вы замените только пины 0 на 3, а 3 на 0, то этого недостаточно, так как в строках 

24 #define TX_HI()   (PORTB |= 0B00001000)
25 #define TX_LO()   (PORTB &= 0B11110111)

так сказать тоже есть пин, и он останется также 3, а не заменится на 0.

Для 0 tx пина, видимо надо так:

24 #define TX_HI()   (PORTB |= 0B00000001)
25 #define TX_LO()   (PORTB &= 0B11111110)