настольная лампа

tulyak

✩✩✩✩✩✩✩
7 Окт 2019
9
6
настольная лампа со встроенным портом зарядки для телефонов. объект заказа подразумевает личное не коммерческое использование.
концепт такой
настольная лампа с основанием и абажуром. в основании находится порт юсб для зарядки.
управление жестом
на датчике apds-9930 (не на 9960)
раздельное управление светодиодной лампой и портом зарядки usb.
алгоритм интерфейса такой
дистанция на котором происходит управление двумя каналами около 20 см.
предположительно
взмах руки в пределах от 0-10 см от датчика включает и выключает лампу.
взмах руки в пределах от 10-20 см включает и выключает порт usb
Желательно чтобы схема сама по себе в ждущем режиме была во сне.
просыпалась и работала по прерыванию с датчика.

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

По большому счету требуется только код, могу его отрабатывать на стенде с ардуино нано с двумя светодиодами и 9930

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


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

Вложения

Изменено:

tulyak

✩✩✩✩✩✩✩
7 Окт 2019
9
6
Данное задание не актуально
Вот такой скетч типа у меня получился, на постоянной сенсорике растояния. К сожалению я не смог решить проблему что сканирование достаточно долгое и при проведении рукой иногда определение расстояния ошибается. Похоже, что как бы расстояние пока меряется, оно идетотбольшейдистанции к меньшей, и в промежуток фиксации в датчике схема отрабатывает. Или датчик так сканирует наклоннне поверхности. Не знаю. Собственно работоспособно. Можно ставить.

C++:
// Подключаем библиотеки:                                       //
#include <Wire.h>
#include <APDS9930.h>
// Для работы с датчиком APDS-9930
APDS9930 apds = APDS9930();   // Определяем объект apds, экземпляр класса APDS9930

int L = 7;    // пин лампы
int U = 9;      // пин юсб
boolean L_Status = 0; //  переменная состояния лампы(сначала выкл)
boolean U_Status = 0; // переменная состояния пота зарядки (сначала выкл)
                                       //
uint16_t proximityData = 0;                                     // Определяем переменную для хранения значения приближения
//
void setup() {
  pinMode(L, OUTPUT);
  pinMode(U, OUTPUT);

          Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
          //  Инициируем работу датчика:                                  //
  if (apds.init()) {                                          // Если инициализация прошла успешно, то ...
  Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
  } else {
    Serial.println("Initialization ERROR!"); // Иначе, выводим сообщение оо ошибке инициализации датчика
  }
  //
  //  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (PGAIN_1X, PGAIN_2X, PGAIN_4X, PGAIN_8X). Чем выше коэффициент тем выше чувствительность
  if (apds.setProximityGain(PGAIN_2X)) {                      // Если установлен коэффициент усиления приёмника в режиме определения расстояния, то ...
  Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
  } else {
    Serial.println("Set gain ERROR!"); // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
  }
  // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getProximityGain(); // в переменную i сохранится значение: PGAIN_1X, или PGAIN_2X, или PGAIN_4X, или PGAIN_8X
  //  Устанавливаем силу тока драйвера ИК-светодиода:             // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность.
  if (apds.setProximityDiode(LED_DRIVE_50MA)) {               // Если установлена сила тока драйвера (яркость) ИК-светодиода для обнаружения приближения, то ...
  Serial.println("Set LED drive OK!");                  // Выводим сообщение об успешной установке силы тока драйвера
  } else {
    Serial.println("Set LED drive ERROR!"); // Иначе, выводим сообщение об ошибке при установке силы тока драйвера
  }
  // Прочитать установленную силу тока можно так: uint8_t i = apds.getProximityDiode(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA
  //  Разрешаем режим определения приближения:                    //
  if (apds.enableProximitySensor(false)) {                    // Если механизм определения приближения (false - без прерываний на выходе INT) запущен, то ...
  Serial.println("Start proximity sensor OK!");         // Выводим сообщение об успешном запуске механизма определения приближения
  } else {
    Serial.println("Start proximity sensor ERROR!"); // Иначе, выводим сообщение об ошибке запуска механизма определения приближения
  }
  // Запретить работу механизма определения приближения можно так: bool j = apds.disableProximitySensor(); // в переменную j сохранится результат выполнения функции (true/false)
  //  Ждём завершение инициализации и калибровки:                 //
  delay(500);                                                 //
}                                                               //
//
void loop() {                                                   //
  //  Читаем определённое датчиком значение приближения:          //
  delay(50);

  if (apds.readProximity(proximityData)) {                    // Если значение приближения корректно прочитано в переменную proximityData, то ..
    Serial.println((String) "Proximity=" + proximityData); // Выводим значение приближения
}


if (proximityData >= 195 && proximityData <= 300) {    // зона срабатывания одного триггера
  Usb();
}


if (proximityData >= 1023) {   // зона срабатывания друго триггера
   Lamp();
    }  
}
void Usb(){     // функция для одного триггера
  U_Status = !U_Status;
    digitalWrite(U, U_Status);
    delay(555); }
void Lamp(){   //  функция для другог триггера
  L_Status = !L_Status;
   digitalWrite(L, L_Status);
   delay(555);
   }
 
Изменено: