Dionisnation

Dionisnation

TRON: TQ7wgZtMxDnMMUMgdCBwcjwgg9qypRNGET
Пикабушник
102К рейтинг 2470 подписчиков 141 подписка 745 постов 206 в горячем
Награды:
10 лет на Пикабу За победу в продуктовом сёрфинге За победу над кибермошенниками За подвиги в Мире PlayStation 5более 1000 подписчиков

8 битный пк

8 битный пк 8 бит, Компьютер, Самоделки, Макет, Гифка
8 битный пк 8 бит, Компьютер, Самоделки, Макет, Гифка
Показать полностью 2

Как сделать тетрис классический

Дисплей от Nokia 5110 - это наверное самый дешевый дисплей который можно найти для своих проектов на Arduino. На базе него мы разберемся с вопросом: "Как же сделать тетрис-игру?@

Основная проблема всех библиотек для рисования на этом дисплее - отсутствие поддержки русского языка. Решается установкой дополнительных шрифтов, которые подменяют английские символы на русские.

Как сделать тетрис классический Тетрис, Своими руками, Arduino, Nokia 5110, Экран, Скетч, Длиннопост

Избалованные i2c шиной скажут "фу", ведь у нас 4 провода управления SCLK, DIN, DC, CE и RTS которые соответственно подключаются к Arduino, 3, 4, 5, 6, 7. Не забываем подключить питание 3.3 вольта, и землю.

Для рисования будем использовать библиотеку Adafruit GFX Library. В архиве с ней есть примеры использования.

Для управления игрой используем ИК пульт от телевизора. Сигнал будет принимать датчик TL1838.

Как сделать тетрис классический Тетрис, Своими руками, Arduino, Nokia 5110, Экран, Скетч, Длиннопост

Я использовал Arduino Uno, т.к. она уже имеет стабилизатор на 3.3 вольт.

Подключение IR приемника:

pin 8 — IR (управляющий). Питание на +5V и GND.

Подключение пьезодинамика:

pin 9 — speaker, Земля на GND.


Скетч тетриса:


// © Klop 2017
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <IRremote.h>
#include <EEPROM2.h>
#define rk 4 // ширина квадратика
#define rz 5 // ширина места
#define smeX 1
#define smeY 1
#define MaxX 10 // стакан кол-во мест по гориз
#define speaker 9
#define RECV_PIN 8 // нога на IRDA приемник
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 6 - LCD chip select (CS)
// pin 7 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
IRrecv irrecv(RECV_PIN);
decode_results results;
byte mstacan[MaxX][30];
byte Lst,SmeH, center, NumNext;
byte MaxY; // стакан кол-во мест по вертик
int dxx, dyy, FigX, FigY, Victory, myspeed,tempspeed;
unsigned long ok, levo, pravo, vniz, myrecord;
unsigned long flfirst=1234; // метка первого запуска
byte fig[][4][4]=
{
{{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}},
{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,0,0}},
{{0,1,0,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},
{{0,0,1,0},
{0,0,1,0},
{0,1,1,0},
{0,0,0,0}},
{{0,0,0,0}, //8
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}}
};
//==============================================
void mybeep() // звук
{analogWrite(speaker, 100);
delay(100);
analogWrite(speaker, 0);
}
//==============================================
void figmove(byte a, byte b)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
fig[a][i][j]=fig[b][i][j];
}
//==============================================
void figinit(byte a)
{
for (byte i=0;i<4;i++)
for (byte j=0;j<4;j++)
{
fig[0][i][j]=fig[NumNext][i][j];
if (fig[a][j][i]==1) // покажем след фигуру
display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+60, 20+(j)*rz, rk , rk, WHITE);
}
display.display();
NumNext=a;
tempspeed=myspeed;
dxx=0;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][3]==2) newgame();
}
//==============================================
void viewstacan()
{
display.drawLine(0,0,0,display.height()-1, BLACK);
display.drawLine(0,display.height()-1,Lst, display.height()-1, BLACK);
display.drawLine(Lst,display.height()-1,Lst,0, BLACK);
for (byte j=4;j<MaxY;j++)
for (byte i=0;i<MaxX;i++)
if (mstacan[i][j]>0)
display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, BLACK);
else display.fillRect(i*rz+1, SmeH+(j-4)*rz, rk , rk, WHITE);
ds(Victory,1);
display.display();
}
//================================================
void ds(int aa, int b)
{
display.fillRect(55, 10, 29, 10, WHITE);
display.setCursor(55,b*10);
display.println(aa);
}
//================================================
bool iffig(int dx, int dy)
{int i,j;
bool flag=true; bool pov=false;
for (i=0;i<MaxX;i++)
for (j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=0; // убрали временно фигуру
if (dx==2) // поворот
{ dx=0; pov=true;
figmove(8,0);
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{ fig[0][i][j]=fig[8][3-j][i];
if (fig[0][j][i]==1)
{ if (i+FigX+dx<0) dx=1; // пробуем отодвинуть от стенки слева на 1
if (i+FigX+dx>MaxX-1) dx=-1;// пробуем отодвинуть от стенки справа на 1
}
}
}
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
if (i+FigX+dx<0 || i+FigX+dx>MaxX-1 || FigY+j+dy>MaxY-1 || mstacan[i+FigX+dx][FigY+j+dy]>0)
{flag=false; break;} // проверили на новые координаты
if (flag)
{FigX=FigX+dx; FigY=FigY+dy;byte k=0;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
{mstacan[i+FigX][j+FigY]=1;
dxx=0;
}
} // переместили фигуру на новые координаты
else
{ if (pov) {figmove(0,8);}
for (i=0;i<4;i++) // восстановили фигуру
for (j=0;j<4;j++)
if (fig[0][j][i]==1)
mstacan[i+FigX][j+FigY]=1;
}
return(flag);
}
//================================================
void clearstacan()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
mstacan[i][j]=0;
}
//================================================
unsigned long getbutton(char s[])
{unsigned long tt;
display.fillRect(5, 30, 40, 10, WHITE);
display.setCursor(5,30);
display.print(s);
display.display();
while (true)
if (irrecv.decode(&results;)) // ловим код кнопки пульта
{ tt=results.value;
delay(400);
irrecv.resume();
break;
}
return(tt);
}
//================================================
void newgame()
{ unsigned long tb;
dxx=0; dyy=1;
display.setCursor(0,0);
clearstacan();
NumNext=random(7)+1;
figinit(random(7)+1);
center=MaxX/2-2;
FigX=center;FigY=0;
display.setCursor(52,0);
display.println("Линий");
viewstacan();
if (Victory>myrecord)
{ myrecord=Victory;
EEPROM_write(16, myrecord);
}
display.setCursor(5,0);
display.print("Рекорд");
display.setCursor(5,10);
display.print(myrecord);
display.display();
display.setCursor(5,20);
delay(2000);irrecv.resume();
display.println("Нажмите");
tb=getbutton(" OK");
if (tb!=ok)
{ ok=tb;
levo=getbutton("Влево");
pravo=getbutton("Вправо");
vniz=getbutton("Вниз");
EEPROM_write(0, ok);
EEPROM_write(4, levo);
EEPROM_write(8, pravo);
EEPROM_write(12, vniz);
}
display.fillRect(5, 0, (MaxX-1)*rz, 40, WHITE);
myspeed=800; tempspeed=myspeed;
Victory=0;
}
//================================================
void setup()
{ unsigned long tr; word gg=0;
randomSeed(analogRead(0));
irrecv.enableIRIn(); // Старт ресивера IRDA
display.begin();
display.setContrast(50);
display.setTextSize(1);
display.setTextColor(BLACK); // установка цвета текста
display.clearDisplay();
Lst=rz*MaxX; // ширина стакана в пикселях
MaxY=display.height()/rz+4; // Высота стакана в кубиках
SmeH=display.height()%rz; // смещение сверху в пикселях для отображения
random(7);
EEPROM_read(0, ok);
EEPROM_read(4, levo);
EEPROM_read(8, pravo);
EEPROM_read(12, vniz);
EEPROM_read(20, tr);
if (tr==flfirst) EEPROM_read(16, myrecord);
else { myrecord=0;
EEPROM_write(16, myrecord);
EEPROM_write(20, flfirst);
}
newgame();
}
//================================================
void dvoiki()
{
for (byte i=0;i<MaxX;i++)
for (byte j=0;j<MaxY;j++)
if (mstacan[i][j]==1)
mstacan[i][j]=2;
}
//================================================
void mydelay(int md)
{
unsigned long starttime=millis();
while (millis()-starttime<md)
{
if (irrecv.decode(&results;)) // ловим код кнопки пульта
{
if (results.value==levo) dxx=-1; else
if (results.value==pravo) dxx=1; else
if (results.value==ok) dxx=2; else
if (results.value==vniz) {tempspeed=100; md=0;}
if (dxx!=0) {iffig(dxx,0); viewstacan(); }
delay(40); // убираем дребезг
irrecv.resume();
}
}
}
//================================================
bool iffs() // есть ли полные строки?
{
bool res=false;
for (byte j=0;j<MaxY;j++)
{
bool fl=true;
for (byte i=0;i<MaxX;i++)
if (mstacan[i][MaxY-1-j]==0) fl=false;
if (fl)
{
Victory++;
myspeed=myspeed-(Victory/30)*50; // через каждые 30 линий увеличим скорость падения
if (myspeed<0) myspeed=0;
res=true; mybeep();
for (byte k=0;k<MaxX;k++)
for (byte n=j;n<MaxY-2;n++)
mstacan[k][MaxY-n-1]=mstacan[k][MaxY-n-2];
viewstacan();
}
}
return(res);
}
//================================================
void loop()
{ if (!iffig(dxx,dyy))
if (!iffig(0,dyy))
{ dvoiki();
figinit(random(7)+1);
FigX=center;FigY=0;
while (iffs()) ;
}
viewstacan();
mydelay(tempspeed);
}

Игра поддерживает привязку к любому пульту. Для этого достаточно в начале игры, на вопрос «Нажмите ОК» нажать на пульте кнопку, которая будет отвечать за вращение фигуры. Если пульт игре уже знакомый, то игра сразу запустится. Если пульт новый, то код кнопки ОК не совпадет с запомненным и игра потребует последовательно нажать кнопки «Влево», «Вправо» и «Вниз». Эти кнопки будут записаны в энергонезависимую память Ардуино и впоследствии именно этот пульт будет узнаваться сразу по нажатию кнопки «ОК».


Как сделать тетрис классический Тетрис, Своими руками, Arduino, Nokia 5110, Экран, Скетч, Длиннопост

При «проваливании» на собранную строку будет воспроизводиться писк. Он реализован на особенности нескольких пинов Ардуино (в нашем случае 9) выдавать ШИМ с заданной частотой. Игра поддерживает все атрибуты нормальной игры. Ту и подсказка следующей фигуры и текущий счет. Игра ведет учет рекордов. Это значение хранится в энергонезависимой памяти Ардуино. Чтобы сбросить рекорд, достаточно изменить в скетче значение flfirst=1234 на любое другое. В игре также идет автоувеличение скорости падения через каждые 30 списанных строчек, так что, бесконечно долго поиграть не получится ). Скетч не оптимизировался и тщательно не прогонялся, а был написан на досуге в свое удовольствие. Если кто обнаружит ошибку — пишите. О ©. Скетч разрешается править для себя как угодно. Только при публикации где-либо своих вариантов ссылку на первоисточник-муську указывайте ). Для чего делал — длинные выходные + «из любви к искусству». Была бы дочка маленькой, сделал бы ей, наверное, мини игровой автомат для кукольной комнатки на 8 марта, как раз успел бы. Добавил бы несколько игр типа Змейки и Арканоида, а корпус вырезал бы из текстолита, наверное. Только дочка в этом году уже докторскую защищает, так, что мимо, но может кому еще эта идея пригодится ).

Как сделать тетрис классический Тетрис, Своими руками, Arduino, Nokia 5110, Экран, Скетч, Длиннопост
Показать полностью 4

Измеряем толщину ЛКП на Arduino

Измерение толщины лакокрасочного покрытия автомобиля сводится к простому измерению индуктивности катушки с полуоткрытым сердечником.

Измеряем толщину ЛКП на Arduino Arduino, Измерительные приборы, Своими руками, Лкп, Толщиномер, Скетч, Длиннопост

Самая сложная часть нашей установки - катушка индуктивности. Она состоит из одной обмотки внутри половинки броневого ферритового сердечника из какой-то радио аппаратуры. Если мы будем прислонять катушку открытой стороной к эелезной пластине (кузову), то чем меньше зазор между обкладками ферритового корпуса, то тем выше индуктивность. Параметры катушки серьезного значения не имеют т.к. схема будет калиброваться.

В моем случае использовалась проволока 0.08 мм для намотки порядка 100 витков. Что бы увеличить ответный сигнал с катушки цепляем параллельно металлопленочный конденсатор 100 пф. Получился колебательный контур чувствительный к толщине ЛКП.

Измеряем толщину ЛКП на Arduino Arduino, Измерительные приборы, Своими руками, Лкп, Толщиномер, Скетч, Длиннопост

Измерять частоту колебаний контура будет Arduino Nano. В зависимости от результатов измерений будут зажигаться 7 диодов-индикаторов. Они будут сигнализировать о толщине окрашенной панели. При правильной калибровке у незамкнутого сердечника магнитопровода будут гареть все диоды (металла нет - шпаклевка), при замыкании вплотную к голому металлу должен гореть один диод (металл). Чувствительность срабатывания остальных индикаторов нужно измерять экспериментально под вашу катушку.

Измеряем толщину ЛКП на Arduino Arduino, Измерительные приборы, Своими руками, Лкп, Толщиномер, Скетч, Длиннопост

Перед использованием измерителя толщины краски нужно выполнить калибровку. Прикладываем датчик к голому магнитному металлу (сталь) и нажимаем кнопку "калибровка". Тем самым в энергонезависимую память Arduino будет сохранен коэффициент измерения. От него будет выполняться отсчет остальных уровней индикации.

Для выполнения измерения прикладываем датчик к кузову автомобиля и нажимаем вторую кнопку "измерение". Индикаторы покажут измеренную толщину краски на кузове.

Измеряем толщину ЛКП на Arduino Arduino, Измерительные приборы, Своими руками, Лкп, Толщиномер, Скетч, Длиннопост

Скетч программы для Arduino:

// программа - Измеритель-толщины покрытия.
// идея отсюда: https://github.com/sae/Arduino-LCQmeter/blob/master/LC-gen.i...
/*
simplest LC-generator on arduino
can be used as lc-meter
(C)SAE762 07.feb.2015 @home
circuit diagramm D2---R(100...1000)---D6---LC---GND; D7---GND
*/
#include <EEPROM.h> // библиотека чтения-записи eeprom
#include "analogComp.h" // библиотека, скчана с гитхаба
/* проверка работы eeprom
*/
//***************** ФУНКЦИИ***********
//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
// эта функия записывает двухбайтовое целое число в РППЗУ по указанному адресу
void EEPROMWriteInt(int p_address, int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
// эта функия считывает двухбайтовое целое число в РППЗУ по указанному адресу
unsigned int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
//********конец объявления фунций************
//обявление переменных
int ctl=2 ; // нога для накачки энергии в контур
int led=13; // нога светодиода
int rise=0; // счетчик переходов через 0
int fall=0; // такой же стетчик
int summ; //накопительный счетчик
int tchk=300; // время измерения
int zero=11625; //отладка
int delta=0; //разница между содержимым eeprom и результатом измерения
//присвоим номера пинов светодиодов
int vbat=0; //напряжение батареи
int vbatpin=6; // аналог вход 6
int mredled=3; // красный светодиод -
int mblueled=4; //синий светодиод -
int mwhiteled=5;//белый светодиод -
int greenled=8;//зеленый светодиод
int pwhiteled=9;//белый светодиод +
int pblueled=10; //синий +
int predled=11; //красный +
// присвоим границы
//++++++++++++++++++++++++++++++++
// тут придется внести ВАШИ значения!!!!
//===============================
int pgreen=25; // граница ОК в плюс
int mgreen=-10;// в минус
int pwhite=55; // граница подозрительно в +
int mwhite=-30;// подозрительно в -
int pblue=100; // крашено
int mblue=-60; // шлифовано
//int pred=130; // шпаклевка
//int mred=-60;//металл
void setup() {
// put your setup code here, to run once:
summ=0;// инициализация накопителя
Serial.begin(9600); // настроим порт УБРАТЬ ПОСЛЕ ОТЛАДКИ
pinMode(led, OUTPUT); //
pinMode(ctl, OUTPUT); // инициализация выхода накачки
//настроим выхода под светодиоды
pinMode(mredled, OUTPUT);
digitalWrite(mredled, HIGH);
pinMode(mblueled, OUTPUT);
digitalWrite(mblueled, HIGH);
pinMode(mwhiteled, OUTPUT);
digitalWrite(mwhiteled, HIGH);
pinMode(greenled, OUTPUT);
digitalWrite(greenled, HIGH);
pinMode(pwhiteled, OUTPUT);
digitalWrite(pwhiteled, HIGH);
pinMode(pblueled, OUTPUT);
digitalWrite(pblueled, HIGH);
pinMode(predled, OUTPUT);
digitalWrite(predled, HIGH);
// тут можно дорожку сделать для индикации светодиодов, если очень хочется
// инициализация компаратора и прерываний
digitalWrite(ctl, LOW);
analogComparator.setOn(AIN0, AIN1);//D6+,D7-
analogComparator.enableInterrupt(comparatorInt,CHANGE);
// проверка режима работа/установка 0
vbat = analogRead(vbatpin); // считываем значение
if (vbat>50) { // если напруга больше 0 запускаем установку 0
rise=0;
// индикация разряженной батареи, но установка 0 продолжается
if (vbat < 700) {digitalWrite(mredled, LOW);digitalWrite(predled, LOW);}
//if no pulses, make a start impulse
if (rise==0) {
pulse();
}
// первый проход
summ=0;
digitalWrite(led, LOW);
rise=0;
fall=0;
delay(tchk); // wait for a second
//Serial.println(rise); // вывод на псолед порт, убрать после отладки
summ=summ+rise;
// второй проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
//третий проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise-15; // -15 странный костыль видимо недосчет во время обработки прерывания
// Serial.print(summ); // убрать после отладки
//вычислим среднее
summ=summ/3; // вот это и есть измренное значение по результатам трех проходов
// это условная толщина покрытия в попугаях
// зная ее, можно с помомощью нехитрых арифметических действий, определить реальную толщину покрытия
//то есть померить калиброванную пленку разной толщины, записать результаты, а потом подобрать коэффициенты.
digitalWrite(led, HIGH);
EEPROMWriteInt(0,summ); //занесем в eeprom
digitalWrite(greenled, LOW); // зажжем зелененький
while (1); // застопорить нахрен после установки 0 !!!!!!!
}
}
// конец процедуры установки
// тут переход к процедуре измерения
//!!!!!Главный цикл!!!
void loop() {
// тут процедура измерения
rise=0;
//Serial.println(EEPROMReadInt(0)); // выводим полученное значение
//if no pulses, make a start impulse
if (rise==0) {
pulse();
}
// первый проход
summ=0;
digitalWrite(led, LOW);
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
// второй проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
//третий проход
rise=0;
fall=0;
delay(tchk); // wait for a second
summ=summ+rise;
// Serial.print(rise);
//вычислим среднее
summ=summ/3;
delta=summ-EEPROMReadInt(0);
Serial.print(EEPROMReadInt(0)); // из памяти
Serial.print(";");
Serial.print(delta);
Serial.println(" pulses/tchk");
digitalWrite(led, HIGH);
if (delta >= mgreen && delta <= pgreen ) {digitalWrite(greenled, LOW);}
if (delta < mblue) digitalWrite(mredled, LOW);
if (delta >= mblue && delta < mwhite ) digitalWrite(mblueled, LOW);
if (delta >= mwhite && delta < mgreen) digitalWrite(mwhiteled, LOW);
if (delta > pblue) digitalWrite (predled,LOW);
if (delta > pwhite && delta <= pblue) digitalWrite (pblueled,LOW);
if (delta > pgreen && delta <= pwhite) digitalWrite (pwhiteled,LOW);
while (1); /// тормоза. измерение окончено
delay(1000); // wait for a second
}
/**
not so clear "magic" with interrupt
we need to block int's when make a power impulse
comparator is connected directly to capacitor
*/
boolean waitforRise=false;
//this function is called when comparator change status
//as set in ACSR register
void comparatorInt() {
if (waitforRise) { //if we waiting for rise
ACSR &= ~(1<<ACIS0);//set interrupt for falling
ACSR |= (1<<ACIS1);
waitforRise=false;
rise++;
} else { //if we waiting for fall
ACSR &= ~(1<<ACIE); //disable interrupt
//impulse to support an oscillations
pulse();
ACSR |= (1<<ACIE); //enable interrupt
ACSR |= ((1<<ACIS1) | (1<<ACIS0)); //set interrupt for rising
waitforRise=true;
}
}
//send power impulse to LC
void pulse() {
pinMode(ctl, OUTPUT);
digitalWrite(ctl, HIGH);
rise++;//make something useless )
//digitalWrite(ctl, LOW);
pinMode(ctl, INPUT);
}

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

Показать полностью 3

Мастер-ключ для домофона

Поговорим о ключах-таблетках для домофонов. Они бывают разных видов, но мы сегодня будем говорить о самом распространенном - работающим на 1 wire протоколе - DS-1990 (Dallas Touch Memory DS-90). Это ключи семейства iButton. Они очень просты по устройству, не имеют встроенной памяти, содержат только 64-битный id устройства.

Мастер-ключ для домофона Arduino, Скетч, Программатор, Домофон, Длиннопост, Текст, Программирование

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

Многие производители считывающих устройств поддерживают так называемые "мастер ключи" - т.е. универсальные коды ключей. Такие обычно выдают обслуживающим организациям для доступа в подъезд. Вот некоторые из них, что можно найти в открытом доступе:

01:BE:40:11:5A:36:00:E1

FF:FF:FF:FF:FF:FF

00:36:5A:11:40:BE

00:00:00:FE:D4:53

00:00:00:00:00:00

00:00:00:01:FF:FF

00:00:09:3С:E4:A9

00:00:FF:FF:FF:FF

00:00:AA:11:BE:00

00:00:0F:2E:B8:76

FF:FF:FF:FF:FF

36:5A:11:40:BE

01:FF:FF:FF:FF

36:5A:39:81:49

00:00:00:00:00

01:FF:FF:FF:FF

56:5A:11:40:BE

36:5A:39:81:49

00:00:00:00:00

0B:57:81:46:01

C9:8E

Соберем программатор для записи ключей. Нам потребуются болванки. В продаже часто встречаются DS1990 и TM2004. TM2004 - можно перезописывать, если не произведена финализация (подача 9 вольт). После финализации ключ сохраняется на вечно.

Программировать будем через Arduino Uno. Подключается ключ на 16 ногу и подтягивается к плюсу. Второй конец ключа на землю.

Мастер-ключ для домофона Arduino, Скетч, Программатор, Домофон, Длиннопост, Текст, Программирование
Мастер-ключ для домофона Arduino, Скетч, Программатор, Домофон, Длиннопост, Текст, Программирование

Скетч программы для Arduino записывает каждый бит отдельно:

include <OneWire.h>
#define pin 10
byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };
OneWire ds(pin); // pin 10 is 1-Wire interface pin now
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte data[8];
delay(1000); // 1 sec
ds.reset();
delay(50);
ds.write(0x33); // "READ" command
ds.read_bytes(data, 8);
Serial.print("KEY ");
for( i = 0; i < 8; i++) {
Serial.print(data[i], HEX);
if (i != 7) Serial.print(":");
}
// Check if FF:FF:FF:FF:FF:FF:FF:FF
// If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
{
Serial.println("...nothing found!");
return;
}
return; // remove when ready to programm
// Check if read key is equal to the one to be programmed
for (i = 0; i < 8; i++)
if (data[i] != key_to_write[i])
break;
else
if (i == 7)
{
Serial.println("...already programmed!");
return;
}
Serial.println();
Serial.print("Programming new key...");
for (uint8_t i = 0; i < 8; i++)
{
ds.reset();
data[0] = 0x3C; // "WRITE" command
data[1] = i; // programming i-th byte
data[2] = 0;
data[3] = key_to_write[i];
ds.write_bytes(data, 4);
Serial.print(".");
uint8_t crc = ds.read();
if (OneWire::crc8(data, 4) != crc) {
Serial.print("error!\r\n");
return;
}
else
Serial.print(".");
send_programming_impulse();
}
Serial.println("done!");
}
void send_programming_impulse()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
delay(60);
digitalWrite(pin, LOW);
delay(5);
digitalWrite(pin, HIGH);
delay(50);
}

Если вы хотите просто считать код ключа, а не программировать его, то закомментируйте строку "remove when ready to programm". При подключении ключа в консоль вывалится считанный код.

Таким образом, можно создать дубликат любого ключа или сделать свой мастер-ключ, если вам известен его код.

Мастер-ключ для домофона Arduino, Скетч, Программатор, Домофон, Длиннопост, Текст, Программирование
Показать полностью 4

Вечерний гость

Залетел в мастерскую через полуоткрытое окошко. Совсем кроха. Был акуратно пойман и выпущен на свободу

Вечерний гость Летучая мышь, Странный гость, Длиннопост, Видео
Вечерний гость Летучая мышь, Странный гость, Длиннопост, Видео
Вечерний гость Летучая мышь, Странный гость, Длиннопост, Видео

UPD: Добавил видео

Показать полностью 3 1

Смысл жизни - в мелочах!

#comment_208632441

Смысл жизни - в мелочах! Скриншот, Комментарии на Пикабу, Смысл жизни, Дверная ручка, Безысходность, Мужские радости

Робот пылесос. Всё новое — это хорошо забытое старое

Вот согласен я с Жаком Пеше. На все 100%
Большинство людей думает что роботы пылесосы это удел 21 века. Но как бы не так.
1959 год. Начало 60-х. Красивые концепты как по дизайну так и по смелости воображения. Люди тех годов были скуты технологиями своего века, но не боялись мечтать и творить.
Ретрофутуризм черпаем мы именно оттуда. 

Люди мечтают о далеком космосе, о развитии цивилизации - отсюда и смелость решений и смелость в дизайне от кухонных комбайнов до автомобилей. Техника может и должна быть красива. Этот тезис прям кричит из дизайна техники тех годов.
А что мы имеем сейчас?
Посмотрите на свои смартфоны и смартфоны других людей. Они безликие... Так же и роботы пылесосы, большинство просто - круглые, черные, убирают пыль. Сегодня эксперементировать с дизайном гаджетов для производителя не выгодно. Все боятся что "пипл не схавает" (пример проджект АРА) поэтом большинство гаджетов в нашем быту имеют скучный "удобный" дизайн. Но как же прекрасен дизайн начала 60 годов. Вы только посмотрите!

Однажды, в одном комиссионном магазине, я нашел холодильник и микроволновку в стилистике ретрофутуризма - и мне есть таки что вам сказать по этому поводу! Я таки просто влюбился в них! Боги, как же прекрасно они смотрелись. Красный, вишнёвый цвет, в сочетании с опуклими линиями и хромированием! Прямо таки кричит о космосе, ракетах, межпланетных перелетах, он рассказывает о тех, давно забытых временах когда люди не боялись мечтать и творить.

Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост
Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост
Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост

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

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

Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост

Немного космический дизайн, правда? Сразу можно вспомнить - Звездные войны, Звездный путь, и много других научно-фантастических сериалов и фильмов.
Многие могут усомнится в том что дальше концепта на картинке этот пылесос мог развиться. Я вас удивлю. Сделали даже рабочий прототип, и тот кто хатя бы мало мальски понимает в аналоговой электронике, понимает что в принципе  на элементарной базе и аналоговой логике такое вполне возможно. Да он не будет иметь блютуз, вай-фай и не будет строить карт комнат. Но искать станцию зарядки и огибать препятствия вполне может! Всего то на аналоговых схемах.

Вот кстати и видео ролик (качество конечно такое себе, кто там делает апскейл старых видео? поможете?)

Робот пылесос на 11:50

В общем, возможности тех годов накладывали таки ограничения на возможности, поэтому использование даного чудо-робота пылесоса было ограничено только на кухне, и только в комплекте с столом управления (чувствуете как фоллаутом запахло?) с экраном и кнопками управления. Да и управление гаджетом было совсем скудное. Одна кнопка отвечала за старт уборки роботом-пылесосом. Вторая за окончание и возврат на базу. Но, согласитесь, что еще нужно для робота пылесоса?

Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост

Но какое смелое решение для тех годов?! Пылесос, компактный, да и еще "робот" сам себе ездит и собирает мусор, да с оговорками, да на кухне, но все же!
Прекрасное время было в 20 веке. Век изобретателей и мечтателей, фантастов, творцов (не побоюсь это сказать) нашего будущего. А что мы имеем сейчас? Лишь единицы готовы рисковать, мечтать, творить. Поэтому многие так боготворят Илона Маска. И я один из них. Хотя я твердо отдаю себе отчет что его заслуга в том что он просто не боится мечтать и воплощать в жизнь самые смелые концепты других людей! Кибертрак, Тесла родстер, Фалкон 9, БФР, полеты на марс, гиперлуп, солар сити, и много других. Он футурист. Он мечтатель. Тот вид людей которых мы фактически потеряли...

Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост

Кухня с блоком управления RCA .

Ради справедливости хочу упомянуть что:

В сети гуляет информация (самая популярная) что все гаджеты из кухни представленной на выставке и в ролике были техническими концептами и управлялись с помощью радиоуправления специалистами за кадром.
Но, повторюсь возможность воплотить в жизнь автоматизацию данного концепта на элементарной базе тех лет - вполне реальна. Дорого. Но реально.

Так что за роботов пылесосов мы должны быть благодарны умам 20 века. Да и за многие сегодняшние гаджеты.

И напоследок. Давайте просто сравним дизайны между которыми 60 лет разницы

Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост
Робот пылесос. Всё новое — это хорошо забытое старое 20 век, Концепт, Робот-пылесос, Бытовая техника, Техника, Ретрофутуризм, 60-е, Whirlpool, Видео, Длиннопост
Показать полностью 8 1

В  г. Ривнэ взорвался азотный завод

Только что на химическом предприятии Ривнэазот произошел значительный взрыв на агрегате производства азотной кислоты, в воздух пошло облако окиси азота.

Облако пошло на город, ориентировочно Северный-Старицкого-Юбилейный!

Закройте окна, на улице воспользуйтесь средствами индивидуально защиты, на всякий случай.

Отличная работа, все прочитано!