Сообщество - TECHNO BROTHER
Добавить пост

TECHNO BROTHER

1 646 постов 12 525 подписчиков

Популярные теги в сообществе:

Моя версия наливатора

Сделан по просьбе друга, в подарок его начальнику. Вдохновлялся проектом Алекса Гайвера, все остальное - полет фантазии и переделки в процессе создания.

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

Дисплей от 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

Неведомая электрическая штука с пружинами

Рядом с Иркутским техническим университетом была найдена такая штуковина:

Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост

На концах пружины:

Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост
Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост

Середина сложной выточенной формы:

Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост

В продолговатом отверстии утолщения видны провода:

Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост
Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост
Неведомая электрическая штука с пружинами Иркутск, WhatIsThisThing, Что это?, Фотография, Длиннопост

Поиск в интернете по картинкам находит посторонние вещи: глушители, отвёртки, держатели лерок.


Что это за штука?

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

Измеряем толщину ЛКП на 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

Новые роботы Boston dynamics такие же неуклюжие, как я

Беда с железом

Что то с компом ребенка

Стоит проц 2200g
грешу на него
но в ентернатах не нашёл подобных жалоб.
что делал поменял мамку(казалось что перегрев моста)
поменял жёсткий диск
поменял блок питания
подкидывал другую оперативку
но дефект остался.
Кто с подобным сталкивался сможет подсказать
Винда ставиться нормально (почти в конце черный экран) перезапускаешь нормально ставишь драйвера на видеокарту и начинается такой секис.... Бывает синий экран устройство не готово или не исправно....
Килограмм запятых и точек не дарить знаю чукча

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

Когда у клиента правки

Сервер упал

Сервер упал Reddit, Перевод, IT юмор

Вольный перевод:

- Техподдержка? Похоже сервер упал.

- Ок. Я позабочусь об этом.

- Не падай духом, сервер. Мы считаем, что ты прекрасно справляешься, и всем ты нравишься.


Источник: https://www.reddit.com/r/memes/comments/p64nvu/depression_no...

Показать полностью 1
Отличная работа, все прочитано!