Да мне нужна программная перезагрузка только что бы я мог запускать ее с пульта от телевизора. Arduini nano
Как правильно отметили выше - программная перезагрузка по сигналу с кнопки пульта - работать не будет, если дуня УЖЕ зависла. Для перезагрузки УЖЕ зависшей дуни применяют другие решения: либо аппаратный ватчдог, либо - внешний аппаратный ватчдог, примеров по юзанью того и другого - валом в сети, бесплатно.
Ну ты в setup как-то инициализируешь - переменные там и т.п.? Ну так вынеси всю инициализацию переменных, зависящих от игры, в отдельное место - и кличь откуда надо. Примерно вот так:
Можно сюда выложить, на панели инструментов редактора есть кнопочка "code" - жмакаешь её и вставляешь свой код. А там - посмотрим, откуда ты этот код утянул :)
// Начало кода (копировать и вставлять в Arduino sketch)
//
// Duino Tag release V1.01
// Лазерная метка для arduino на основе протокола Miles Tag.
// По J44industries: www.J44industries.blogspot.com
// Для информации о создании собственного Дуино Таггер идут: https://www.instructables.com/member/j44/
//
// Большая заслуга заслуживает того, чтобы пойти в Duane O'Brien, если бы не было отличных учебников Duino Tag, которые он написал, я бы никогда не смог написать этот код.
// Учебники Duane настоятельно рекомендуется читать для того, чтобы получить лучшее понимание arduino и ИК-связи. См. его сайт http://aterribleidea.com/duino-tag-resources/
//
// Этот код устанавливает основы для Arduino на основе системы лазерных тегов и пытается придерживаться протокола Miles tag, где это возможно.
// Км тэг детали: http://www.lasertagparts.com/mtdesign.htm
// Есть много возможностей для расширения возможностей этой системы, и, надеюсь, игра будет продолжать развиваться в течение некоторого времени.
// Licence: Attribution Share Alike: дайте кредит, где кредит должен быть, но вы можете делать то, что вам нравится с кодом.
// Если у вас есть Код, улучшений или дополнений пожалуйста, перейдите на http://duinotag.blogspot.com
//
#include <IRremote.h>
// Digital IO's
//int lifePin = ; // An analogue output (PWM) level corresponds to remaining life. Use PWM pin: 3,5,6,9,10 or 11. Can be used to drive LED bar graphs. eg LM3914N
//int ammoPin = ; // An analogue output (PWM) level corresponds to remaining ammunition. Use PWM pin: 3,5,6,9,10 or 11.
//int trigger2Pin = ; // Push button for secondary fire. Low = pressed
//int IRtransmit2Pin = 8; // Secondary fire mode IR transmitter pin: Use pins 2,4,7,8,12 or 13. DO NOT USE PWM pins!!
int IRreceive2Pin = 99; // Allows for checking external sensors are attached as well as distinguishing between sensor locations (eg spotting head shots)
//int audioPin = 9; // Audio Trigger. Can be used to set off sounds recorded in the kind of electronics you can get in greetings card that play a custom message.
int x=0;
const byte teamPin = 3; //if you hold trigger when start, you ll be team 2 , led red on
int triggerPin = 4; // Push button for primary fire. Low = pressed
int speakerPin = 5; // Direct output to piezo sounder/speaker
int hitPin = 13; // LED output pin used to indicate when the player has been hit.
int IRtransmitPin = 7; // Primary fire mode IR transmitter pin: Use pins 2,4,7,8,12 or 13. DO NOT USE PWM pins!! More info: http://j44industries.blogspot.com/2009/09/arduino-frequency-generation.h...
int IRreceivePin = 6;
int recarga = 8;
String recebido="0";
// The pin that incoming IR signals are read from
// Minimum gun requirements: trigger, receiver, IR led, hit LED.
int ledTeamPin =2;
// Player and Game details
int myTeamID = 1; // 1-7 (0 = system message)
int myPlayerID = 5; // Player ID
int myGameID = 1; // Interprited by configureGame subroutine; allows for quick change of game types.
int myWeaponID = 0; // Deffined by gameType and configureGame subroutine.
int myWeaponHP = 0; // Deffined by gameType and configureGame subroutine.
int maxAmmo = 0; // Deffined by gameType and configureGame subroutine.
int maxLife = 0; // Deffined by gameType and configureGame subroutine.
int automatic = 0; // Deffined by gameType and configureGame subroutine. Automatic fire 0 = Semi Auto, 1 = Fully Auto.
int automatic2 = 0; // Deffined by gameType and configureGame subroutine. Secondary fire auto?
//Incoming signal Details
int received[18]; // Received data: received[0] = which sensor, received[1] - [17] byte1 byte2 parity (Miles Tag structure)
int check = 0; // Variable used in parity checking
// Stats
int ammo = 0; // Current ammunition
int life = 0; // Current life
// Code Variables
int timeOut = 0; // Deffined in frequencyCalculations (IRpulse + 50)
int FIRE = 0; // 0 = don't fire, 1 = Primary Fire, 2 = Secondary Fire
int TR = 0; // Trigger Reading
int LTR = 0; // Last Trigger Reading
int T2R = 0; // Trigger 2 Reading (For secondary fire)
int LT2R = 0; // Last Trigger 2 Reading (For secondary fire)
int Trecarga=0;
float ultimaRecarga=0;
// Signal Properties
int IRpulse = 600; // Basic pulse duration of 600uS MilesTag standard 4*IRpulse for header bit, 2*IRpulse for 1, 1*IRpulse for 0.
int IRfrequency = 38; // Frequency in kHz Standard values are: 38kHz, 40kHz. Choose dependant on your receiver characteristics
int IRt = 0; // LED on time to give correct transmission frequency, calculated in setup.
int IRpulses = 0; // Number of oscillations needed to make a full IRpulse, calculated in setup.
int header = 4; // Header lenght in pulses. 4 = Miles tag standard
int maxSPS = 10; // Maximum Shots Per Seconds. Not yet used.
int TBS = 300; // Time between shots. Not yet used.
float ultimoTiro =0;
// Transmission data
int byte1[8]; // String for storing byte1 of the data which gets transmitted when the player fires.
int byte2[8]; // String for storing byte1 of the data which gets transmitted when the player fires.
int myParity = 0; // String for storing parity of the data which gets transmitted when the player fires.
// Received data
int memory = 10; // Number of signals to be recorded: Allows for the game data to be reviewed after the game, no provision for transmitting / accessing it yet though.
int hitNo = 0; // Hit number
// Byte1
int player[10]; // Array must be as large as memory
int team[10]; // Array must be as large as memory
// Byte2
int weapon[10]; // Array must be as large as memory
int hp[10]; // Array must be as large as memory
int parity[10]; // Array must be as large as memory
//IR
IRrecv irrecv(IRreceivePin);
decode_results results;
//IR
void setup() {
// Serial coms set up to help with debugging.
Serial.begin(9600);
Serial.println("Startup...");
irrecv.enableIRIn(); // Start the receiver
// Pin declarations
//pinMode(audioPin, OUTPUT);
//pinMode(trigger2Pin, INPUT);
//pinMode(IRreceive2Pin, INPUT);
//pinMode(IRtransmit2Pin, OUTPUT);
//pinMode(lifePin, OUTPUT);
//pinMode(ammoPin, OUTPUT);
pinMode(triggerPin, INPUT);
pinMode(speakerPin, OUTPUT);
pinMode(recarga, INPUT);
pinMode(hitPin, OUTPUT);
pinMode(IRtransmitPin, OUTPUT);
pinMode(IRreceivePin, INPUT);
pinMode(teamPin, INPUT);
digitalWrite(teamPin, LOW);
pinMode(ledTeamPin, OUTPUT);
digitalWrite(ledTeamPin, LOW);
digitalWrite(triggerPin, HIGH); // Not really needed if your circuit has the correct pull up resistors already but doesn't harm
// digitalWrite(trigger2Pin, HIGH); // Not really needed if your circuit has the correct pull up resistors already but doesn't harm
digitalWrite(recarga, HIGH);
frequencyCalculations(); // Calculates pulse lengths etc for desired frequency
configureGame(); // Look up and configure game details
tagCode(); // Based on game details etc works out the data that will be transmitted when a shot is fired
for (int i = 1;i < 254;i++) { // Loop plays start up noise
//analogWrite(ammoPin, i);
playTone((3000-9*i), 2);
}
Serial.println("Ready....");
}
// Main loop most of the code is in the sub routines
void loop(){
receiveIR();
if(FIRE != 0){
shoot();
}
triggers();
}
/*void lifeDisplay() { // Updates Ammo LED output
float lifeF;
lifeF = (260/maxLife) * life;
if(lifeF <= 0){lifeF = 0;}
if(lifeF > 255){lifeF = 255;}
analogWrite(lifePin, ((int) lifeF));
} */
void receiveIR() { // Void checks for an incoming signal and decodes it if it sees one.
if (irrecv.decode(&results)) {
Serial.println(results.value);
recebido=results.value; //value received by IR sensor
Serial.println(recebido);
irrecv.resume(); // Receive the next value
}
if(myTeamID==0 && recebido=="2399713221") //value send by team 1 gun
{
hit();
}
if(myTeamID==1 && recebido=="2103698458") //value send by team 0 gun
{
hit();
}
}
void shoot() {
if(FIRE == 1){ // Has the trigger been pressed?
Serial.println("FIRE 1");
sendPulse(IRtransmitPin, 4); // Transmit Header pulse, send pulse subroutine deals with the details
delayMicroseconds(IRpulse);
for(int i = 0; i < 8; i++) { // Transmit Byte1
if(byte1[i] == 1){
sendPulse(IRtransmitPin, 1);
//Serial.print("1 ");
}
//else{Serial.print("0 ");}
sendPulse(IRtransmitPin, 1);
delayMicroseconds(IRpulse);
}
for(int i = 0; i < 8; i++) { // Transmit Byte2
if(byte2[i] == 1){
sendPulse(IRtransmitPin, 1);
// Serial.print("1 ");
}
//else{Serial.print("0 ");}
sendPulse(IRtransmitPin, 1);
delayMicroseconds(IRpulse);
}
if(myParity == 1){ // Parity
sendPulse(IRtransmitPin, 1);
}
sendPulse(IRtransmitPin, 1);
delayMicroseconds(IRpulse);
Serial.println("");
Serial.println("DONE 1");
}
if(FIRE == 2){ // Where a secondary fire mode would be added
Serial.println("FIRE 2");
sendPulse(IRtransmitPin, 4); // Header
Serial.println("DONE 2");
}
FIRE = 0;
ammo = ammo - 1;
}
void sendPulse(int pin, int length){ // importing variables like this allows for secondary fire modes etc.
// This void genertates the carrier frequency for the information to be transmitted
int i = 0;
int o = 0;
while( i < length ){
i++;
while( o < IRpulses ){
o++;
digitalWrite(pin, HIGH);
delayMicroseconds(IRt);
digitalWrite(pin, LOW);
delayMicroseconds(IRt);
}
}
}
void triggers() { // Checks to see if the triggers have been presses
LTR = TR; // Records previous state. Primary fire
// LT2R = T2R; // Records previous state. Secondary fire
TR = digitalRead(triggerPin); // Looks up current trigger button state
// T2R = digitalRead(trigger2Pin); // Looks up current trigger button state
// Code looks for changes in trigger state to give it a semi automatic shooting behaviour
if(TR != LTR && TR == LOW && (millis()-ultimoTiro) > TBS){
FIRE = 1;
ultimoTiro=millis();
}
if(T2R != LT2R && T2R == LOW){
FIRE = 2;
}
if(TR == LOW && automatic == 1){
FIRE = 1;
}
if(T2R == LOW && automatic2 == 1){
FIRE = 2;
}
if(FIRE == 1 || FIRE == 2){
if(ammo < 1){FIRE = 0; noAmmo();}
if(life < 1){FIRE = 0; dead();}
// Fire rate code to be added here
}
//verifica se recarregou a arma
Trecarga=digitalRead(recarga);
if((Trecarga==LOW) && (millis() - ultimaRecarga) > TBS)
{
ultimaRecarga=millis();
playTone(500, 100);
playTone(500, 100);
playTone(500, 100);
ammo=8;
}
}
void configureGame() { // Where the game characteristics are stored, allows several game types to be recorded and you only have to change one variable (myGameID) to pick the game.
if(myGameID == 0){
x=digitalRead(recarga);
Serial.println("Valor de X");
Serial.println(x);
// if(digitalRead(triggerPin)==LOW) //define the team based in the triger, if its pressed when start
if(x==0) //verifica o time baseado na chave normal aberto time 0 normal fechado time 1
{
digitalWrite(ledTeamPin,HIGH);
}
if(myGameID == 0){
myWeaponID = 1;
maxAmmo = 360;
ammo = 30;
maxLife = 3;
life = 3;
myWeaponHP = 1;
}
if(myGameID == 1){
myWeaponID = 1;
maxAmmo = 360;
ammo = 30;
maxLife = 3;
life = 3;
myWeaponHP = 1;
}
}
Serial.print("team ");
Serial.print(myTeamID);
}
void frequencyCalculations() { // Works out all the timings needed to give the correct carrier frequency for the IR signal
IRt = (int) (500/IRfrequency);
IRpulses = (int) (IRpulse / (2*IRt));
IRt = IRt - 4;
// Why -4 I hear you cry. It allows for the time taken for commands to be executed.
// More info: http://j44industries.blogspot.com/2009/09/arduino-frequency-generation.h...
Serial.print("Oscilation time period /2: ");
Serial.println(IRt);
Serial.print("Pulses: ");
Serial.println(IRpulses);
timeOut = IRpulse + 900; // Adding 50 to the expected pulse time gives a little margin for error on the pulse read time out value
}
void tagCode() { // Works out what the players tagger code (the code that is transmitted when they shoot) is
byte1[0] = myTeamID >> 2 & B1;
byte1[1] = myTeamID >> 1 & B1;
byte1[2] = myTeamID >> 0 & B1;
byte1[3] = myPlayerID >> 4 & B1;
byte1[4] = myPlayerID >> 3 & B1;
byte1[5] = myPlayerID >> 2 & B1;
byte1[6] = myPlayerID >> 1 & B1;
byte1[7] = myPlayerID >> 0 & B1;
byte2[0] = myWeaponID >> 2 & B1;
byte2[1] = myWeaponID >> 1 & B1;
byte2[2] = myWeaponID >> 0 & B1;
byte2[3] = myWeaponHP >> 4 & B1;
byte2[4] = myWeaponHP >> 3 & B1;
byte2[5] = myWeaponHP >> 2 & B1;
byte2[6] = myWeaponHP >> 1 & B1;
byte2[7] = myWeaponHP >> 0 & B1;
myParity = 0;
for (int i=0; i<8; i++) {
if(byte1[i] == 1){myParity = myParity + 1;}
if(byte2[i] == 1){myParity = myParity + 1;}
myParity = myParity >> 0 & B1;
}
// Next few lines print the full tagger code.
Serial.print("Byte1: ");
Serial.print(byte1[0]);
Serial.print(byte1[1]);
Serial.print(byte1[2]);
Serial.print(byte1[3]);
Serial.print(byte1[4]);
Serial.print(byte1[5]);
Serial.print(byte1[6]);
Serial.print(byte1[7]);
Serial.println();
Serial.print("Byte2: ");
Serial.print(byte2[0]);
Serial.print(byte2[1]);
Serial.print(byte2[2]);
Serial.print(byte2[3]);
Serial.print(byte2[4]);
Serial.print(byte2[5]);
Serial.print(byte2[6]);
Serial.print(byte2[7]);
Serial.println();
Serial.print("Parity: ");
Serial.print(myParity);
Serial.println();
}
void playTone(int tone, int duration) { // A sub routine for playing tones like the standard arduino melody example
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void dead() { // void determines what the tagger does when it is out of lives
// Makes a few noises and flashes some lights
for (int i = 1;i < 254;i++) {
// analogWrite(ammoPin, i);
playTone((1000+9*i), 2);
}
// analogWrite(ammoPin, ((int) ammo));
// analogWrite(lifePin, ((int) life));
Serial.println("DEAD");
for (int i=0; i<10; i++) {
digitalWrite(hitPin,HIGH);
delay (500);
digitalWrite(hitPin,LOW);
delay (500);
}
}
void noAmmo() { // Make some noise and flash some lights when out of ammo
digitalWrite(hitPin,HIGH);
playTone(500, 100);
playTone(1000, 100);
digitalWrite(hitPin,LOW);
}
void hit() { // Make some noise and flash some lights when you get shot
digitalWrite(hitPin,HIGH);
Serial.println("HIT");
life = life - 1;
Serial.print("Life: ");
Serial.println(life);
playTone(500, 500);
if(life <= 0){dead();}
digitalWrite(hitPin,LOW);
// lifeDisplay();
}
Много, жизнь нынче дорогая. Дай угадаю - раз поступил встречный вопрос, значит - ты готов заплатить ну максимум рублей 200 на телефон, правда? Если так - это не ко мне, точно. Мои расценки начинаются от 2000 рублей, за меньшее браться просто неинтересно.
[Честно? Желания разбираться в сей наколенной поделке - ноль.
Так всегда. Ассоциации - всё равно что залезть в мусорный бак.((
Коллеги, не преувеличивайте :) Не самый убогий код. Встроить в него кнопочку "вечной жизни" -5 минут работы. Строчка life=life-1 прямо бросается в глаза :)
dimax, как показывает практика - в таком коде еще пяццот ошибок, которые заказчик после того, как ему незадорого поможешь, вывалит на тебя со словами "а вот что-то не работает"... Потом выясняется, что он паяльник держит за жало и т.п.
[Честно? Желания разбираться в сей наколенной поделке - ноль.
Так всегда. Ассоциации - всё равно что залезть в мусорный бак.((
Коллеги, не преувеличивайте :) Не самый убогий код. Встроить в него кнопочку "вечной жизни" -5 минут работы. Строчка life=life-1 прямо бросается в глаза :)
Ну да, а потом ещё ammo править, а то ВНЕЗАПНО окажется, что жизнь-то вечная, а патронов - тю-тю. И т.д. и т.п. Короче, это не пять минут, а полноценное вникание в логику работы, а перед этим - отформатировать это дело (ладно, тут быстро очень).
Не, без ТЗ - нинада даже смотреть. А с ТЗ - может статься, что быстрее написать с чистого листа, чем вкуривать в наколенное ;)
Дак правильно. Берут и пользуются. Иногда даже спасибо говорят. И это нормально. Это имеет право на жизнь. НО.
Это как письмо, как произведение. Вы можете писать как хотите, но от этого и мнение о вас будет соответствующее.)
Программная перезагрузка канает? Что за ардуина?
В целом - как примерный вариант программной перезагрузки для Uno, Nano, Pro Mini, Mega:
void(* resetFunc) (void) = 0; bool wantReset = false; void interruptHandler() { wantReset = true; } void setup() { attachInterrupt(digitalPinToInterrupt(2),interruptHandler, RAISING); } void loop() { if(wantReset) { wantReset = false; resetFunc(); } }На пине 2 - прерывание, по высокому уровню ардуина перезагружается.
Есть ещё варианты с аппаратным ватчдогом (надо чекать, чтобы был правильный загрузчик), с внешним ватчдогом - да кучу всяких вариантов.
Да мне нужна программная перезагрузка только что бы я мог запускать ее с пульта от телевизора. Arduini nano
Вы, надеюсь. понимаете, что если ардуина УЖЕ зависла, то сигнал с ИК она не примет? А если она ЕЩЕ НЕ зависла, то зачем ее перегружать?
для чего нужна перезагрузка? Если для перезагрузки зависшей ардуинки - то это не поможет. По работе с пультами есть масса примеров в сети
Как правильно отметили выше - программная перезагрузка по сигналу с кнопки пульта - работать не будет, если дуня УЖЕ зависла. Для перезагрузки УЖЕ зависшей дуни применяют другие решения: либо аппаратный ватчдог, либо - внешний аппаратный ватчдог, примеров по юзанью того и другого - валом в сети, бесплатно.
епта, Скиф, ну ты где, спишь чтоля ?
Я пытаюсь сделать лазертаг и мне нужна функция возражения я нинашел ничего лучше перезагрузки
епта, Скиф, ну ты где, спишь чтоля ?
Дай уже ТС-у 500р и программу.
Хочу себе тоже "функцию возражения" и на жену настроить, чтоб автоматически отбрехиватьса.
Что за "функция возражения"? Кому она должна возражать? По поводу чего возражать? И главное - какими аргументами она должна возражать?
Типо если тебя убили что бы начать игру сначала.
ВОЗРОЖДЕНИЯ?
А зачем для этого дуину перегружать?
Так чтобы все массивы зареспаунились.
А как еще
Для этого МК перезагружать вовсе не обязательно.
Тогда подскажите как это сделать?
Инициализировать всё по новой, и всё.
А это с помощью ИК можно сделать?
Ну ты в setup как-то инициализируешь - переменные там и т.п.? Ну так вынеси всю инициализацию переменных, зависящих от игры, в отдельное место - и кличь откуда надо. Примерно вот так:
bool flag = false; byte array[10] = {0}; void init() { flag = false; memset(array,0,sizeof(array)); } void setup() { init(); } void loop() { if(ИГРА_ЗАКОНЧИЛАСЬ) init(); else { продолжаем игру. } }Да.
А можете мне внести эти изменения в скетч
Я просто вообще ни понимаю много
В пустой ))
Так у тебя скетча вообще нет, как я вижу :)
Есть я пошутил
Как его отправить
Можно сюда выложить, на панели инструментов редактора есть кнопочка "code" - жмакаешь её и вставляешь свой код. А там - посмотрим, откуда ты этот код утянул :)
В инете нашел
Как обычно. На деревню дедушке. (Detsemen-у))
Я бы тоже сюда влупил "jmp 0", а не стал переписывать иниты ))
Я бы тоже сюда влупил "jmp 0", а не стал переписывать иниты ))
+1 Яркий пример того, что и среди тех, кто выкладывает свои "проекты" на импортных форумах - полно Г-кодеров
Так поможете?
Честно? Желания разбираться в сей наколенной поделке - ноль.
ну помогите пожалуйскта
ну помогите пожалуйскта
Бюджет?
Пострелять даст.
Ну а сколько надо?
Много, жизнь нынче дорогая. Дай угадаю - раз поступил встречный вопрос, значит - ты готов заплатить ну максимум рублей 200 на телефон, правда? Если так - это не ко мне, точно. Мои расценки начинаются от 2000 рублей, за меньшее браться просто неинтересно.
читер?
[Честно? Желания разбираться в сей наколенной поделке - ноль.
Так всегда. Ассоциации - всё равно что залезть в мусорный бак.((
[Честно? Желания разбираться в сей наколенной поделке - ноль.
Так всегда. Ассоциации - всё равно что залезть в мусорный бак.((
Коллеги, не преувеличивайте :) Не самый убогий код. Встроить в него кнопочку "вечной жизни" -5 минут работы. Строчка life=life-1 прямо бросается в глаза :)
dimax, как показывает практика - в таком коде еще пяццот ошибок, которые заказчик после того, как ему незадорого поможешь, вывалит на тебя со словами "а вот что-то не работает"... Потом выясняется, что он паяльник держит за жало и т.п.
[Честно? Желания разбираться в сей наколенной поделке - ноль.
Так всегда. Ассоциации - всё равно что залезть в мусорный бак.((
Коллеги, не преувеличивайте :) Не самый убогий код. Встроить в него кнопочку "вечной жизни" -5 минут работы. Строчка life=life-1 прямо бросается в глаза :)
Ну да, а потом ещё ammo править, а то ВНЕЗАПНО окажется, что жизнь-то вечная, а патронов - тю-тю. И т.д. и т.п. Короче, это не пять минут, а полноценное вникание в логику работы, а перед этим - отформатировать это дело (ладно, тут быстро очень).
Не, без ТЗ - нинада даже смотреть. А с ТЗ - может статься, что быстрее написать с чистого листа, чем вкуривать в наколенное ;)
Не самый убогий код.
Ну если это "не самый убогий":
Serial.print("Byte1: "); Serial.print(byte1[0]); Serial.print(byte1[1]); Serial.print(byte1[2]); Serial.print(byte1[3]); Serial.print(byte1[4]); Serial.print(byte1[5]); Serial.print(byte1[6]); Serial.print(byte1[7]);то я даже боюсь предположить, что ты называешь убогим кодом :)
Ну да, в том то и дело что dimax сам пишет похлеще этого.) (Без обид).
Green, это шутка юмора, или есть примеры, где у меня более убогий код? :)
Я бы не сказал что "убогий", но через одно место это точно. Видно что вы железячник.
Green, ну да, железячник. Но вроде никто из программистов не ругался на мои программы.
Дак правильно. Берут и пользуются. Иногда даже спасибо говорят. И это нормально. Это имеет право на жизнь. НО.
Это как письмо, как произведение. Вы можете писать как хотите, но от этого и мнение о вас будет соответствующее.)